如何在子类

时间:2016-02-29 08:15:23

标签: 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()){}
}

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

class Child: Parent {
     val e: E // How do I initialize this?
}

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

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

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

2 个答案:

答案 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)