在Kotlin中调用超类的构造函数,Super不是一个表达式

我有两个类EntityAccount as

 abstract class Entity( var id: String? = null, var created: Date? = Date()) { constructor(entity: Entity?) : this() { fromEntity(entity) } fun fromEntity(entity: Entity?): Entity { id = entity?.id created = entity?.created return this; } } 

 data class Account( var name: String? = null, var accountFlags: Int? = null ) : Entity() { constructor(entity: Entity) : this() { super(entity) } } 

这给了我错误

超级不是一个表达式,它只能用在点的左侧。

为什么我不能这样做?

以下将传递编译错误,但我不确定是否正确。

  constructor(entity: Entity) : this() { super.fromEntity(entity) } 

你的代码中有几个问题。

首先,这是从辅助构造函数调用超级构造函数的正确语法:

 constructor(entity: Entity) : super(entity) 

其次,如果你的类有一个主构造函数 (你的类有),你不能从一个辅助构造函数调用一个超级构造函数。

解决方案1

 abstract class Entity( var id: String, var created: Date ) class Account( var name: String, var accountFlags: Int, id: String, created: Date ) : Entity(id, created) { constructor(account: Account) : this(account.name, account.accountFlags, account.id, account.created) } 

在这里,复制构造函数在刚刚委托给主构造函数的子类中。

解决方案2

 abstract class Entity( var id: String, var created: Date ) { constructor(entity: Entity) : this(entity.id, entity.created) } class Account : Entity { var name: String var accountFlags: Int constructor(name: String, accountFlags: Int, id: String, created: Date) : super(id, created) { this.name = name this.accountFlags = accountFlags } constructor(account: Account) : super(account) { this.name = account.name this.accountFlags = account.accountFlags } } 

在这里,我只是在子类中使用二级构造函数,它让我委派他们个人超级构造函数。 注意代码很长。

解决方案3(最惯用)

 abstract class Entity { abstract var id: String abstract var created: Date } data class Account( var name: String, var accountFlags: Int, override var id: String, override var created: Date ) : Entity() 

在这里,我省略了复制构造函数,并将属性抽象为子类具有所有属性。 我也让孩子班级成为一个data class 。 如果你需要克隆这个类,你可以直接调用account.copy()

使用这个super<Entity>.fromEntity(entity)来调用超类方法。

正如文档所述:

在Kotlin中,实现继承受以下规则的约束:如果一个类从它的直接超类继承了同一个成员的许多实现,它必须覆盖这个成员并提供它自己的实现(或许使用其中一个继承的实现)。 为了表示从中继承实现的超类型,我们使用超级限定的超类型名称,例如super。

 constructor(entity: Entity) : this() { super<Entity>.fromEntity(entity) } 

要了解更多信息,请阅读覆盖规则