2017-05-29 97 views
5

最近開始使用科特林構造在科特林

根據科特林文檔,可以有一個主構造和一個或多個次級構造函數。

我不明白爲什麼我看到這個錯誤 enter image description here

由於類test不具備主要的構造。

這工作得很好:

open class test { 
} 

class test2 : test() { 
} 

這裏是我所面臨的另一個困難,當我定義了一個次級構造的IDE顯示了另一個錯誤說

超類型的初始化是不可能沒有主構造 enter image description here

但在前面的工作示例中,我沒有初始化它,但它工作正常。我錯了什麼?

+0

這是覆蓋了科特林文檔中的構造? http://kotlinlang.org/docs/reference/classes.html#constructors –

回答

5

由於即使未在基類中定義主構造函數或輔助構造函數,仍然會爲該類生成默認的無參數構造函數,因此會出現此錯誤。派生類的構造函數應該總是調用一些超級構造函數,而在你的情況下只有默認構造函數(這是可以調用的構造函數,如test()來創建類的對象)。編譯器和IDE迫使你這樣做。


超級構造函數規則在一定程度上使問題複雜化。

如果您在派生類中定義了一個沒有定義主構造函數的輔助構造函數(類聲明附近沒有括號),那麼輔助構造函數本身應該調用超級構造函數,並且不應該在該類中指定超級構造函數參數聲明:

class test2 : test { // no arguments for `test` here 
    constructor(a: Int) : super() { /* ... */ } 
}

另一種方法是定義主構造函數和從二級一個叫它:

class test2() : test() { 
    constructor(a: Int) : this() { /* ... */ } 
} 
+0

謝謝,@hotkey,這清除了我面臨的第二個問題,我仍然不明白爲什麼IDE顯示**這種類型有一個構造函數**時我在'test2'中繼承'test',顯然'test'沒有構造函數,對嗎? –

+1

@ShafayatAlam,嗯,它實際上是這樣的:如果你在一個類中定義了主要和次要構造函數,仍然會生成一個默認的無參數構造函數,並且由於超級構造函數應該總是在派生類中被調用,你打電話給默認的一個。 – hotkey

+0

@ShafayatAlam,更新了答案並解釋了這一點。 – hotkey