是否可以在scala中重载构造函数?

时间:2010-09-25 10:31:03

标签: scala override

我的问题是,如果可以在scala中重载构造函数吗?

所以我可以写代码如下:

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

如果不可能,是否有相应的技巧?

3 个答案:

答案 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)    
  }    

}   

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