混合する特性の前に初期化する必要がある匿名クラスがあります。「this」参照の使用が許可されていないため、早期初期化は機能しません。クラスを self 型の内部トレイトとして宣言すれば機能させることができますが、この型はコード内の 1 か所でしか使用されず、匿名クラスとしてインライン化するのは直感的であるため、これは不必要に冗長に思えます。ただし、scala が受け入れ、私が持っている初期化順序の要件を満たす構文を見つけたようです。これは余分な詳細を除いた単純化された例です (私がこのようにする理由があると仮定します)。
trait WaitCondition[+T] {
...
}
trait EventWaitCondition[+T] extends WaitCondition[T] {
...
}
trait Event { outer =>
private[this] var _cachedWaitCondition : Option[WaitCondition[T]]
def next() : WaitCondition[T] =
//Is there a way to "inline" the defintion of NextWaitCondition
//without screwing up the initialization order?
_cachedWaitCondition.getOrElse{ new NextWaitCondition with EventWaitCondition[T] }
private[this] trait NextWaitCondition { this : WaitCondition[T] =>
outer._cache = Some(this)
....
}
....
}
したがって、基本的に、私の質問は、NextWaitCondition と WaitCondition の間の初期化順序を変更せずに (つまり、NextWaitCondition が最初に初期化されるように)、匿名型として NextWaitCondition の定義をインライン化する方法があるということです。