2010-09-25 203 views
3

我的问题是,如果有可能在scala中重载构造函数?是否有可能在scala中重载构造函数?

所以,我可以写类似的代码:

var = new Foo(1) 
var = new Foo("bar") 

而如果它是不可能的,有什么招数等同?

+0

您正在讨论构造函数,而不是类初始化函数。请改变你的问题的措辞。类加载时运行类initilizer,而在创建类的实例时调用构造函数。 – 2010-09-25 12:09:15

+0

可能重复[Scala构造函数重载?](http://stackoverflow.com/questions/1095329/scala-constructor-overload) – 2010-09-25 14:26:40

回答

9

当然,但有限制。斯卡拉要求你的一个构造函数是“主要的”。主构造函数具有特殊的方便的语法,可以将构造函数的参数放在类名后面。其他“次要”构造函数也可以被定义,但是他们需要调用主构造函数。这与Java不同,并且更具限制性。这样做是为了让构造函数参数可以被当作字段来处理。

你的榜样看起来像

class Foo(myArg:String){ //primary constructor 
    def this(myIntArg:Int) = this(myIntArg.toString) //secondary constructor 
} 

val x = new Foo(1) 
val y = new Foo("bar") 
+0

谢谢,我错过了'编程斯卡拉'中的'辅助构造函数'部分。 – 2010-09-25 10:52:14

5

正如你在戴夫格里菲斯的例子中看到,主构造必须是“最一般的”一个在这个意义上,任何其他构造函数必须直接或间接调用它( )。你可以想象,这有时会导致丑陋的主要构造函数。一个常见的策略是使用同伴对象隐藏的丑陋(你不需要输入“新”):

class Foo private (arg:Either[String, Int]){ 
    ... 
} 

object Foo { 
    def apply(arg:String) = new Foo(Left(arg)) 
    def apply(arg:Int) = new Foo(Right(arg)) 
} 

val a = Foo(42) 
val b = Foo("answer") 

当然,如果你想从你的类继承,你一定要小心(例如在上面的例子中这是不可能的)

+0

这比辅助构造函数更好。因为aux构造函数只能做一些简单的字段转换,但是这个apply()可以在代码逻辑中做很多工作来标准化完全不同的输入。 – linehrr 2017-08-11 07:32:57

0
class MyCons{  

    def this(msg:String){  
     this()  
     println(msg) 
    }  

    def this(msg1:String , msg2:String){  
     this()  
     println(msg1 +" "+msg2)  
    }  

} 

对于其他辅助构造函数,我们必须调用主构造函数或其他辅助定义。

+0

如果您的答案与这个答案一样久远,那么解释您的答案与已经提供的答案有何不同就很有帮助。 – jwvh 2017-07-25 05:37:27

相关问题