考虑以下代码:
abstract class Foo(val s: String) {
def this(i: Int) = this("" + (i+2))
}
据我所知,构造函数不是继承的,并且不能像Java中那样使用super
从子类调用辅助构造函数。
它们只是一个无用的工件还是有一些合理的用例?
答案 0 :(得分:17)
scala> object Bar extends Foo(3)
defined module Bar
scala> Bar.s
res3: String = 5
答案 1 :(得分:11)
子类的主要构造函数必须调用超类的构造函数之一,而不一定是主类构造函数。
abstract class A(s: String) {
def this(i: Int) = this(i.toString)
}
class B(i: Int) extends A(i)
答案 2 :(得分:3)
除了@ coubeatczech的答案之外,如果添加细化,还可以创建抽象类(和特征)的实例,
scala> :paste
// Entering paste mode (ctrl-D to finish)
abstract class Foo(val s: String) {
def this(i: Int) = this("" + (i+2))
}
// Exiting paste mode, now interpreting.
defined class Foo
scala> val f = new Foo(23) {}
f: Foo = $anon$1@13d874e
scala> f.s
res3: String = 25
虽然我在上面显示了一个空的细化(“{}”),但您通常会提供一些额外的定义,通常为抽象成员提供实现,
scala> abstract class Bar { def bar : Int }
defined trait Bar
scala> val b : Bar = new Bar { def bar = 23 }
b: Bar = $anon$1@1e17c6d
scala> b.bar
res1: Int = 23