Если вы используете Scala 2.9, вы можете организовать что-то вроде этого:
class A {
println("Hi")
}
class B extends A with DelayedInit {
private[this] var count = 0
println("Hey")
def delayedInit(x: => Unit) {
x
count += 1
if (count==2) { println("There") }
}
}
class C extends B { println("Ho") }
class D extends C { println("Ha") }
Это использует новую черту DelayedInit
, которая отправляет отложенные конструкторы из текущего и всех дочерних классов в метод delayedInit
. К сожалению, поскольку нет сигнала завершения, вы ограничены пропуском одного конструктора. Таким образом, для C
мы получаем:
scala> new C
Hi
Hey
Ho
There
, где блок "Там" волшебным образом появился после блока "Ho" из C
. К сожалению, если вы расширите C
, новая инициализация произойдет последней:
scala> new D
Hi
Hey
Ho
There
Ha
(Вам на самом деле не нужен A
там ... Я просто положил его туда, чтобы проиллюстрировать, что происходит с суперклассами.)