【问题标题】:What's the use case of secondary constructors in abstract classes?抽象类中辅助构造函数的用例是什么?
【发布时间】:2011-08-31 10:06:13
【问题描述】:
考虑这段代码:
abstract class Foo(val s: String) {
def this(i: Int) = this("" + (i+2))
}
据我所知,构造函数不是继承的,二级构造函数不能像在 Java 中那样从带有super 的子类调用。
它们只是一个无用的工件还是这个构造有一些合理的用例?
【问题讨论】:
标签:
scala
constructor
abstract-class
language-design
【解决方案1】:
scala> object Bar extends Foo(3)
defined module Bar
scala> Bar.s
res3: String = 5
【解决方案2】:
子类的主构造函数必须调用超类的构造函数之一,不一定是主构造函数。
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