抽象类中的次要构造函数有什么用途?

14

考虑以下代码:

abstract class Foo(val s: String) {
  def this(i: Int) = this("" + (i+2))
}

就我所了解的,构造函数是不能被继承的,并且子类也无法使用super调用父类的次要构造函数,这和Java有所不同。

它们只是一个无用的遗物还是有一些合理的用途呢?

构造函数不可被继承且子类无法调用父类的次要构造函数,是否有实际用途尚未确定。

3个回答

17
scala> object Bar extends Foo(3)
defined module Bar

scala> Bar.s
res3: String = 5

11

子类的主构造函数必须调用超类的一个构造函数,不一定是主构造函数。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接