如何让数据类在Kotlin中实现Interface / extends Superclass属性?

时间:2017-07-17 16:44:40

标签: inheritance properties kotlin data-class

我有几个包含var id: Int?字段的数据类。我想在接口超类中表达这一点,并且具有扩展它的数据类,并在构造它们时设置它id。但是,如果我试试这个:

interface B {
  var id: Int?
}

data class A(var id: Int) : B(id)

它抱怨我覆盖了id字段,我是哈哈..

:在这种情况下,我如何让数据类A在构建时id,并设置id接口超类中声明?

1 个答案:

答案 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)