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?
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)