Penso che sia molto importante per spiegare non solo la sintassi, ma anche quale ruolo svolge l'ordinamento dei tratti. Ho trovato la spiegazione in Jason Swartz Learning Scala (pagina 177) abbastanza illuminante.
Una classe Scala può estendere più tratti contemporaneamente, ma le classi JVM possono estendere solo una classe genitore. Il compilatore Scala risolve questo creando "copie di ciascun tratto per formare una gerarchia a colonna singola alta della classe e tratti", un processo noto come linearizzazione .
In questo contesto, si estende più tratti in comune con i nomi dei campi identici non riuscirebbe a compilare, esattamente lo stesso "come se si stesse estendendo una classe e che fornisce la propria versione di un metodo ma non è riuscito ad aggiungere un parola chiave override" .
E dal momento che determina la forma dell'albero di ereditarietà, l'ordine di linearizzazione è davvero una questione molto importante da considerare. Ad esempio, class D extends A with B with C
(dove A è una classe e B e C sono tratti) diventerebbe class D extends C extends B extends A
. I seguenti poche righe, anche dal libro, illustrare che perfettamente:
trait Base { override def toString = "Base" }
class A extends Base { override def toString = "A->" + super.toString }
trait B extends Base { override def toString = "B->" + super.toString }
trait C extends Base { override def toString = "C->" + super.toString }
class D extends A with B with C { override def toString = "D->" + super.toString }
Una chiamata a new D()
avrebbe il REPL stampare i seguenti:
D->C->B->A->Base
che riflette perfettamente la struttura del grafico eredità linearizzato .
fonte
2016-10-10 13:00:38
??? fare una domanda e poi essersi autoproclamata –
L'avevo provato una volta con Eclipse molto tempo fa e questo non ha funzionato. Dopo l'aggiornamento, e scrivendo il test ho pensato: "Forse proverò qualcosa e vedrò se riesco a trovarlo da solo". –
@Peter: non c'è niente di sbagliato nel chiedere e rispondere, purché sia una domanda valida. – Grundlefleck