Potrzebuję inteligentnego mechanizmu do komponowania składu, który pozwala mieszanym cechom zainicjować po komponencie komponowanej. Poniższy rzuca NullPointerException
:Inicjowanie opóźnionej cechy
class Component {
def addListener(pf: PartialFunction[Any, Unit]) {}
}
trait DynamicComponent {
protected def component: Component
component.addListener {
case x =>
}
}
class Foo extends DynamicComponent {
protected val component = new Component
}
new Foo // -> NullPointerException
Następujące rzeczy są opcje nie dla mnie:
- Korzystanie
protected lazy val component
; to by wyprodukować avalange z kilkudziesięciu valsów, które muszą stać się leniwe, coś Nie chcę. - Umieszczenie
addListener
w metodzie, np.initDynamic()
; ponieważ będę mieszał w wielu cechach i nie chcę pamiętać o wywołaniu kilku metodinitFoo()
. - Używanie
DelayedInit
. To nie działa z cechami, przynajmniej według skaladoców.
mógłbym żyć z jednym init()
rozmowy, ale tylko pod następującymi warunkami:
- wszystkich miesza się cechami łatwo deklarować się powoływać w tej jednej rozmowy
- jest kompilacji błąd zapomnieć o oświadczeniu
init()
.
Ach tak, zapomniałem o tej możliwości. Niestety w moim przypadku użycia, mam dodatkowe pośrednie: Mam 'jak AbstractFoo rozszerza DynamicComponent' i' Foo extends AbstractFoo', gdzie składnik jest przez 'Foo' i jego metody malowania _call w_ metod dostarczonych przez' AbstractFoo'- używając wczesnej definicji, 'Foo' nie widzi żadnych metod z' AbstractFoo'. Hmm .... –