假设我有一个Parent类,它有四个字段A,B,C和D,这样可以选择使用默认实现传递或初始化C和D:
open class Parent(val a: A, val b: B, val c: C, val d: D) {
constructor(a: A, b: B, c: C): this(a, b, c, DImpl()){}
constructor(a: A, b: B): this(a, b, CImpl(), DImpl()){}
}
我需要扩展这个类并在子类中添加另一个字段:
class Child: Parent {
val e: E // How do I initialize this?
}
将val
传递给辅助构造函数不起作用,也不使用init{}
块。
将val
传递给主构造函数可以工作,但是我失去了Parent
类中辅助构造函数的委托 - 我需要使用所有Parent
构造函数params或复制辅助构造函数,将实现细节泄露给Child
类。
这应该很简单,我在这里遗漏了什么吗?
答案 0 :(得分:8)
如果确实需要使用辅助构造函数,并且不能使用@Ingo Kegel建议的默认值,则可以通过分配参数值来初始化e
字段,就像在Java中执行此操作一样到酒店:
class Child: Parent {
val e: E
constructor(a: A, b: B, c: C, d: D, e: E) : super(a, b, c, d) {
this.e = e
}
}
答案 1 :(得分:7)
您可以使用默认值而不是辅助构造函数:
open class Parent(val a: A, val b: B, val c: C = CImpl(), val d: D = DImpl())
class Child(a: A, b: B, val e: E): Parent(a, b)