在Kotlin中调用超类的构造函数,Super不是一个expression式
我有两个类Entity
和Account
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) } }
这给了我错误
超级不是一个expression式,它只能用在点的左侧。
为什么我不能这样做?
以下将传递编译错误,但我不确定是否正确。
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()
在这里,我省略了复制构造函数,并将属性抽象为子类具有所有属性。 我也让孩子class级成为一个data class
。 如果你需要克隆这个类,你可以直接调用account.copy()
。
使用这个super
来调用超类方法。
正如文档所述:
在Kotlin中,实现inheritance受以下规则的约束:如果一个类从它的直接超类inheritance了同一个成员的许多实现,它必须覆盖这个成员并提供它自己的实现(或许使用其中一个inheritance的实现)。 为了表示从中inheritance实现的超types,我们使用超级限定的超types名称,例如super。
constructor(entity: Entity) : this() { super.fromEntity(entity) }
要了解更多信息,请阅读覆盖规则