抽象类中辅助构造函数的用例是什么?

时间:2011-08-31 10:06:14

标签: scala constructor abstract-class language-design

考虑以下代码:

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

据我所知,构造函数不是继承的,并且不能像Java中那样使用super从子类调用辅助构造函数。

它们只是一个无用的工件还是有一些合理的用例?

3 个答案:

答案 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