Scala构造函数重载?

scala

59150 观看

6回复

30695 作者的声誉

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

作者: Landon Kuhn 的来源 发布者: 2009 年 7 月 7 日

回应 (6)


32

30695 作者的声誉

 class Foo(x: Int, y: Int) {
     def this(x: Int) = this(x, 0) // default y parameter to 0
 }
作者: Landon Kuhn 发布者: 07.07.2009 11:16

181

2976 作者的声誉

决定

值得一提的是,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);   
}
作者: Jon McAuliffe 发布者: 08.07.2009 07:10

15

1079 作者的声誉

从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)

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

作者: Jörgen Lundberg 发布者: 12.12.2010 01:31

9

5000 作者的声誉

在查看代码时,我突然意识到我确实在重载了构造函数。然后,我想起了这个问题,然后回来给出另一个答案:

在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)
        …
    }
}

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

作者: flying sheep 发布者: 05.07.2011 03:53

1

2265 作者的声誉

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

作者: asyncwait 发布者: 01.06.2012 12:52

0

3109 作者的声誉

尝试这个

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
  }
}
作者: anish 发布者: 31.03.2014 05:02
32x32