我有几个包含var id: Int?
字段的数据类。我想在接口或超类中表达这一点,并且具有扩展它的数据类,并在构造它们时设置它id
。但是,如果我试试这个:
interface B {
var id: Int?
}
data class A(var id: Int) : B(id)
它抱怨我覆盖了id
字段,我是哈哈..
问:在这种情况下,我如何让数据类A
在构建时id
,并设置id
在接口或超类中声明?
答案 0 :(得分:7)
确实,你还不需要abstract class。您可以覆盖interface属性,例如:
interface B {
val id: Int?
}
// v--- override the interface property by `override` keyword
data class A(override var id: Int) : B
interface没有构造函数,因此您无法通过super(..)
关键字调用构造函数,但您可以使用abstract class。 Howerver,data class无法在其primary constructor上声明任何参数,因此它会覆盖超类的字段,例如:
// 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)