Scala构造函数重载?

Lan*_*uhn 129 scala

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

Jon*_*ffe 181

值得明确提到的是,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);   
}
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是如何使用重载构造函数。即使对于案例类,`new` 关键字也是必要的,这并非微不足道。 (2认同)

Lan*_*uhn 32

 class Foo(x: Int, y: Int) {
     def this(x: Int) = this(x, 0) // default y parameter to 0
 }
Run Code Online (Sandbox Code Playgroud)


Jör*_*erg 15

从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)
Run Code Online (Sandbox Code Playgroud)

具有默认值的参数必须位于参数列表中没有默认值的参数之后.

  • 但这不适用于非平凡的默认值.所以`class Foo(val x:Int,y:Int = 2*x)`不起作用. (3认同)

fly*_*eep 9

在查看我的代码时,我突然意识到我做了一个重载构造函数.然后我想起了那个问题,又回来给出了另一个答案:

在Scala中,您不能重载构造函数,但可以使用函数执行此操作.

此外,许多人选择使apply伴侣对象的功能成为相应类的工厂.

使这个类抽象并重载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)
        …
    }
}
Run Code Online (Sandbox Code Playgroud)

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