是否可以在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())
}
}
答案 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集合库中。