2016-02-29 39 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) 
相關問題