I have several data classes which include a var id: Int?
field. I want to express this in an interface or superclass, and have data classes extending that and setting this id
when they are constructed. However, if I try this:
interface B {
var id: Int?
}
data class A(var id: Int) : B(id)
It complains I'm overriding the id
field, which I am haha..
Q: How can I let the data class A
in this case to take an id
when it's constructed, and set that id
declared in the interface or superclass?
We cannot extend a data class but in order to implement the same feature, we can declare a super class and override the properties in a sub-class.
Kotlin Data Class RequirementsData class can implement interfaces and extend to other classes. The parameters of the class can be either val or var type.
In Kotlin we use a single colon character ( : ) instead of the Java extends keyword to extend a class or implement an interface.
Kotlin provides the ability to extend a class or an interface with new functionality without having to inherit from the class or use design patterns such as Decorator. This is done via special declarations called extensions.
Indeed, you needn't an abstract class yet. you can just override the interface properties, for example:
interface B {
val id: Int?
}
// v--- override the interface property by `override` keyword
data class A(override var id: Int) : B
An interface has no constructors so you can't call the constructor by super(..)
keyword , but you can using an abstract class instead. Howerver, a data class can't declare any parameters on its primary constructor, so it will overwritten the field of the superclass, for example:
// v--- makes it can be override with `open` keyword
abstract class B(open val id: Int?)
// v--- override the super property by `override` keyword
data class A(override var id: Int) : B(id)
// ^
// the field `id` in the class B is never used by A
// pass the parameter `id` to the super constructor
// v
class NormalClass(id: Int): B(id)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With