2010-09-25 83 views
1

我想知道是否有可能在Scala中繼承輔助構造函數?是否有可能在Scala中繼承輔助構造函數?

我測試此代碼,它抱怨

temp.scala:18: error: too many arguments for constructor Child:()this.Child

val a = new Child(42)

^
abstract class Father { 
var value: Int = 0 

protected def setValue(v: Int) = { 
    value = v 
} 

protected def this(v: Int) = { 
    this() 
    setValue(v) 
} 
} 

class Child extends Father { 
} 

val a = new Child(42) 

但是,如果我在子類中把

protected def this(v: Int) = { 
    this() 
    setValue(v) 
} 

,萬事大吉。

+1

在你提供的,「否」的證據。 – 2010-09-25 12:32:24

+1

相關問題(和答案):http://stackoverflow.com/questions/1095329/scala-constructor-overload/1096534#1096534 – 2010-09-25 12:38:12

+1

構造函數沒有被繼承。不在Scala中,不在Java中。不是主要的,不是次要的。 – 2010-09-25 14:28:27

回答

2

絕對不行,你的例子說明了爲什麼。您已經引入了一個可變的變量value,可能會或可能不會被初始化 - 這取決於使用的確切構造函數。

這是很多問題的潛在來源,因此斯卡拉決定所有對象的創建應該最終通過主構造函數來定向,這確保了一致的初始化。

如果你想value有一個默認值,然後你可以指定它作爲默認參數(在2.8+):

abstract class Father(val value : Int = 0) 

,或者您可以使用auxiluary構造函數來實現斯卡拉同樣的效果2.7:

abstract class Father(val value : Int) { 
    def this() = this(0) 
} 

隨着上述任何一種方式定義Father,孩子的以下定義都是有效的:

class Child(v:Int) extends Father(v) 

class Child extends Father() 

如果您絕對需要,您也可以製作value var,但我強烈建議不要這樣做。

如果value語義意味着它是有效的沒有被初始化,那麼正確的斯卡拉成語是將其聲明爲Option[Int]

abstract class Father(val value : Option[Int] = Some(0)) 
1

你的子構造函數沒有參數,你試圖用它來實例化它!您的Child構造函數聲明一個參數,然後把它傳遞給Father類,例如:

class Child(v:Int) extends Father(v) { 
} 

val a = new Child(42)