Per quanto posso dire, la motivazione (come indicato nel link qui sotto) è:
"Naturalmente quando una val viene ignorata, non è inizializzato più di una volta Quindi, anche se x2 nell'esempio di cui sopra. è apparentemente definito in ogni punto, questo non è il caso: una val di override apparirà nullo durante la costruzione di superclassi, così come una val astratta. "
Non vedo perché questo è naturale. È completamente possibile che il r.h.s. di un incarico potrebbe avere un effetto collaterale. Si noti che tale struttura di codice è completamente impossibile in C++ o Java (e suppongo che Smalltalk, sebbene non possa parlare per quella lingua). In realtà devi fare questi doppi incarichi impliciti ... ticilpmi ... EXPlicit in quei linguaggi tramite costruttori. Alla luce del r.h.s. incertezza dell'effetto collaterale, in realtà non sembra affatto una motivazione: la capacità di aggirare gli effetti collaterali della superclasse (annullando in tal modo gli invarianti della superclasse) tramite ASSIGNMENT? Ick!
Esistono altre motivazioni "killer" per consentire una struttura del codice non sicura? I linguaggi orientati agli oggetti hanno fatto a meno di un tale meccanismo per circa 40 anni (30 anni dispari, se contate dalla creazione della lingua), perché includerlo ora?
E ... solo ... sembra ... pericoloso.
fonte
2012-10-15 15:15:04
Sono descritti nella sezione 20.5 di Programmazione in Scala, ma chiamato "campi pre-inizializzati". –