だから私は答えを見つけたようです。私はDelayedInit特性アプローチを採用することにしました-遅延コードを実行し(そして実行された回数を数えます)、十分な初期化(拡張機能のクラスごとに1つ)が見られたと思ったら必要なコードを実行します階層)。私はそれを特性に包みました:
trait AfterInit extends DelayedInit {
def afterInit
private var initCount = 0
private def getInitNumber(clazz: Class[_]):Int =
if (clazz.getSuperclass == classOf[java.lang.Object]) 0 else getInitNumber(clazz.getSuperclass) + 1
final def delayedInit(x: => Unit) {
x
initCount += 1
if (getInitNumber(this.getClass) + 1 == initCount) afterInit
}
}
使用法:
abstract class A(id:String) extends AfterInit {
var sum = 0
def add(n:Int) = { sum += n; sum }
def afterInit = if (sum > 10) () else throw new Exception
}
class B extends A("B") {
val add1 = add(50)
}
new B // no exception
class C extends A("C") {
val add2 = add(5)
}
new C // exception is thrown, since the `sum` was too small