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)
}
这给出以下输出:
scala> new Y
String is null
res6: Y = Y@18aeabe
如何在调用
a
时让父类
X
等待
s
初始化     
已邀请:
父级字段和父级构造函数始终被初始化,并在子级字段和构造函数之前运行。这意味着对
a
的调用发生在子类中设置set6ѭ之前。 通常,从构造函数中调用虚拟方法是个坏主意。 C ++甚至不允许它(或者,不是从超级类的构造函数调用子类中实现的方法,而不是不允许它)。 但是,如果将ѭ8中的ѭ6变成ѭ9或
def
,则可以修复它。
lazy val
会在首次访问它们的值时被初始化,无论是由谁进行的; ѭ10不会引起像ѭ13或
val
这样的初始化问题。但是,请注意不要在
a
的实现中调用任何其他未初始化的结构,因为相同的问题将再次出现。 编辑: 您还可以使用Scala的“早期定义”(或早期初始化)功能:
class Y extends {
  var s = \"Hello\"
} with X {
  def a: Unit = println (\"String is \"+s)
}
    

要回复问题请先登录注册