斯卡拉构造函数重载?

你如何在Scala中提供重载的构造函数?

值得明确提及的是,Scala中的辅助构造函数必须调用主构造函数(如landon9720的答案)或另一个来自同一类的辅助构造函数作为它们的第一个动作。 它们不能像在Java中那样直接调用超类的构造函数。 这确保了主要构造函数是唯一的入口点。

class Foo(x: Int, y: Int, z: String) { // default y parameter to 0 def this(x: Int, z: String) = this(x, 0, z) // default x & y parameters to 0 // calls previous auxiliary constructor which calls the primary constructor def this(z: String) = this(0, z); } 
  class Foo(x: Int, y: Int) { def this(x: Int) = this(x, 0) // default y parameter to 0 } 

从Scala 2.8.0开始,你也可以使用构造函数和方法参数的默认值。 喜欢这个

 scala> class Foo(x:Int, y:Int = 0, z:Int=0) { | override def toString() = { "Foo(" + x + ", " + y + ", " + z + ")" } | } defined class Foo scala> new Foo(1, 2, 3) res0: Foo = Foo(1, 2, 3) scala> new Foo(4) res1: Foo = Foo(4, 0, 0) 

具有默认值的参数必须在参数列表中没有缺省值的参数之后。

看着我的代码,我突然意识到,我做了一个重载构造函数。 然后我想起了这个问题,回来再给出一个答案:

在Scala中,你不能重载构造函数,但是你可以用函数来做到这一点。

另外,许多人select将伴侣对象的applyfunction作为相应类的工厂。

使这个类抽象并重载apply函数来实现实例化这个类,你有你的重载的“构造函数”:

 abstract class Expectation[T] extends BooleanStatement { val expected: Seq[T] … } object Expectation { def apply[T](expd: T ): Expectation[T] = new Expectation[T] {val expected = List(expd)} def apply[T](expd: Seq[T]): Expectation[T] = new Expectation[T] {val expected = expd } def main(args: Array[String]): Unit = { val expectTrueness = Expectation(true) … } } 

请注意,我明确地定义了每个apply返回Expectation[T] ,否则它将返回一个duck-typed Expectation[T]{val expected: List[T]}

我想可能是Scala构造函数 (2008-11-11)可以添加更多的信息。

尝试这个

 class A(x: Int, y: Int) { def this(x: Int) = this(x, x) def this() = this(1) override def toString() = "x=" + x + " y=" + y class B(a: Int, b: Int, c: String) { def this(str: String) = this(x, y, str) override def toString() = "x=" + x + " y=" + y + " a=" + a + " b=" + b + " c=" + c } }