2010-09-25 56 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)