Ho bisogno di un meccanismo intelligente per la composizione dei componenti che consenta caratteri misti per inizializzare dopo il componente composto. La seguente tiri un NullPointerException
:Inizializzazione del carattere di ritardo
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
Le seguenti cose sono non opzioni per me:
- Uso
protected lazy val component
; quello produrrebbe un di valanga di dozzine di vals che devono diventare pigri, qualcosa Io non voglio. - Inserendo
addListener
in un metodo, ad es.initDynamic()
; perché mescolerò molti tratti e non voglio ricordare di chiamare una mezza dozzina di metodiinitFoo()
. - Utilizzo di
DelayedInit
. Questo non funziona con i tratti, almeno secondo gli scaladoc.
potrei vivere con una sola init()
chiamata, ma solo alle seguenti condizioni:
- tutti mescolati in tratti può facilmente dichiarare ad essere utilizzate a questo singola chiamata
- si tratta di una compilazione errore da dimenticare l'istruzione
init()
.
Ah, sì, ho dimenticato questa possibilità. Sfortunatamente, nel mio caso d'uso, sto avendo un'ulteriore indiretta: mi piace "AbstractFoo estende DynamicComponent" e "Foo estende AbstractFoo', dove il componente è fornito da" Foo "e i suoi metodi di pittura" richiamano "i metodi forniti da" AbstractFoo "- usando la definizione iniziale, 'Foo' non vede più alcun metodo da' AbstractFoo'. Hmm .... –