Scala构造函数签名

时间:2014-03-13 13:06:47

标签: scala constructor abstract-class abstract

是否可以在Scala中定义构造函数签名?

abstract class A {
    def this (s: String): this.type // doesn't work
    def this (i: Int): this.type    // doesn't work
    def this (d: Double): this.type // doesn't work
}

class B(var s: String) extends A {
    def this(i: Int) = {
        this("int "+i.toString())
    }
    def this(d: Double) = {
        this("double "+d.toString())
    }
}

3 个答案:

答案 0 :(得分:3)

你想要达到什么目的?你可以这样做:

abstract class A(i: Int)

case class B(s: String) extends A(s.toInt) {
  def this(i: Int) = {
    this(i.toString)
  }

  def this(d: Double) = {
    this(d.toString)
  }
}

用法:

B("1")
new B(1)
new B(1.0)

答案 1 :(得分:2)

不,这是不可能的。构造函数很特殊:您需要编写new X()而不是X(),并且没有多态分派,例如你做不到def test[A]() = new A()。所以没有抽象构造函数有任何意义的场景。

答案 2 :(得分:2)

正如其他答案所指出的,你无法完全按照自己的意愿行事,但一种方法是使用工厂:

trait Foo { 
  // methods you need
}

trait FooCompanion[T <: Foo] {
  // these methods replace constructors in your example
  def apply(s: String): T
  def apply(i: Int): T
  ...
}

实现:

class Bar(s: String) extends Foo {
  ...
}

object Bar extends FooCompanion[Bar] {
  def apply(s: String) = new Bar(s)
  ...
}

您可以使用FooCompanion方法。例如,使用这种模式。在Scala集合库中。