我的问题是,如果可以在scala中重载构造函数吗?
所以我可以写代码如下:
var = new Foo(1)
var = new Foo("bar")
如果不可能,是否有相应的技巧?
答案 0 :(得分:9)
当然,但有限制。 Scala要求你的一个构造函数是“主要的”。主构造函数具有将构造函数args放在类名后面的特殊,方便的语法。也可以定义其他“辅助”构造函数,但是它们需要调用主构造函数。这与Java不同,而且更具限制性。它以这种方式完成,因此构造函数args可以被视为字段。
您的示例看起来像
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")
答案 1 :(得分:6)
正如您在Dave Griffith的示例中所看到的,主要构造函数必须是“最一般”的构造函数,在任何其他构造函数必须调用它(直接和间接)的意义上。正如您可以想象的那样,这有时会导致丑陋的主要构造函数。一个常见的策略是使用伴侣对象隐藏丑陋(并且您不需要键入“新”):
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")
当然,如果你想从你的班级继承,你必须要小心(例如,在上面的例子中这是不可能的)
答案 2 :(得分:0)
class MyCons{
def this(msg:String){
this()
println(msg)
}
def this(msg1:String , msg2:String){
this()
println(msg1 +" "+msg2)
}
}
对于其他辅助构造函数,我们必须调用主构造函数或之前定义的其他辅助函数。