Scala 2.8:如何初始化子类

Jus*_*s12 2 scala scala-2.8

请考虑以下代码:

abstract class X {
  def a:Unit
  a
}

class Y extends X {
  var s:String = "Hello"
  def a:Unit = println ("String is "+s)
}
Run Code Online (Sandbox Code Playgroud)

这给出了以下输出:

scala> new Y
String is null
res6: Y = Y@18aeabe
Run Code Online (Sandbox Code Playgroud)

如何在调用时让父类X等待s初始化a

Jea*_*let 6

父项的字段和父构造函数始终初始化并在子项的字段和构造函数之前运行.这意味着调用将a在您var s在子类中设置之前发生.

通常,从构造函数调用虚方法是个坏主意; C++甚至不允许它(或者,而不是禁止它,从超类的构造函数调用时不调用子类中实现的方法).

但是,你可以,如果你把你解决它var sclass Y进入lazy valdef代替.lazy vals无论是谁,都会在第一次访问它们的值时进行初始化; defs不会出现vars或vals 等初始化问题.但是,请注意不要在实现中调用任何其他未初始化的结构a,因为同样的问题将再次出现.

编辑:

您还可以使用Scala的"早期定义"(或早期初始化)功能:

class Y extends {
  var s = "Hello"
} with X {
  def a: Unit = println ("String is "+s)
}
Run Code Online (Sandbox Code Playgroud)