阅读了有关delayedInit 的各种帖子后,我惊讶地发现它实际上每次都被构建期间的各个子类调用。我不确定我是否相信这一点,但后来我做了下面的测试。无论如何,我的问题是,delayedInit 听起来像是一种有用的机制,可以从抽象类驱动某种最终操作(例如,可能通知另一个对象创建完成)。如果它只被调用一次,这将是有道理的。但是,如果您冒着被重复调用的风险而没有在它的参数中传递任何其他有用的信息,那么如何从函数中构建任何类型的有用构造呢?我怎么能将它编程为只在最后一层施工时触发,而不必知道 A 类扩展的深度?
object LearnDelayedInit extends App {
class A extends DelayedInit {
def delayedInit(x: => Unit) {
x // call constructor code
println("delayed init called")
}
}
class B extends A {
println("Hello from B")
}
class C extends B {
println("hello from C")
}
val c = new C
}
输出:
Hello from B
delayed init called
hello from C
delayed init called