考虑以下代码:
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
我怎样才能获得父类X
等待s
调用时要初始化a
父级的字段和父级构造函数始终在子级的字段和构造函数之前初始化和运行。这意味着调用a
发生在你之前var s
是在子类中设置的。
一般来说,从构造函数中调用虚方法是一个坏主意。 C++ 甚至不允许它(或者,不是不允许它,而是在从超类的构造函数调用时不调用子类中实现的方法)。
但是,如果您将您的var s
in class Y
into a lazy val
or a def
反而。lazy val
s 在第一次访问它们的值时被初始化,无论由谁访问;def
s 不会造成初始化问题,例如var
s or val
s。但是,请注意不要从实现中调用任何其他未初始化的结构a
,因为同样的问题会再次出现。
Edit:
您还可以使用 Scala 的“早期定义”(或早期初始化)功能:
class Y extends {
var s = "Hello"
} with X {
def a: Unit = println ("String is "+s)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)