你的代码有几个问题。
首先,这是从次要构造函数调用超级构造函数的正确语法:
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()
即可。
constructor(entity: Entity) : super(entity)
- Miha_x64