2016-02-29 22 views
3

假设我有一个具有四个字段A,B,C和d,使得C和d任选通过或默认实现初始化类家长:如何在子类多个父类的构造函数与VAL混合

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班。

这应该很简单,我错过了什么吗?

回答

8

如果确实需要使用辅助构造函数,而不能使用默认值由@Ingo凯格尔建议,可以初始化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 
    } 
} 
+0

其实,我可以并且会同时使用这两个,但是你的答案对我来说是头疼的问题。事实证明,答案很简单,我只是错过了Kotlin语法中的一部分(回顾起来很明显)。 – npace

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) 
相关问题