如何在子类中使用val混合多个父类构造函数

npa*_*ace 4 inheritance constructor kotlin

假设我有一个类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()){}
}
Run Code Online (Sandbox Code Playgroud)

我需要扩展这个类并向子类添加另一个字段:

class Child: Parent {
     val e: E // How do I initialize this?
}
Run Code Online (Sandbox Code Playgroud)

传递val给辅助构造函数不起作用,也不使用init{}块.

传递val给主构造函数可以工作,但后来我失去了对Parent类中辅助构造函数的委托- 我需要使用所有Parent构造函数和所有参数,或者复制辅助构造函数,将实现细节泄露给Child类.

这应该很简单,我在这里遗漏了什么?

yol*_*ole 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
    }
}
Run Code Online (Sandbox Code Playgroud)


Ing*_*gel 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)
Run Code Online (Sandbox Code Playgroud)