2013-05-07 10 views
13

Vorrei eseguire l'override di una variabile mutabile in Trait nel costruttore. Ma si lamenterà che "la variabile sovrascrivente a nel tratto A di tipo Int, la variabile a non può sovrascrivere una variabile mutabile". Perché la scala non mi permette di farlo? E qualche buona pratica per questo? GrazieCome sovrascrivere una variabile mutabile in Tratto in scala?

trait A{ 
    var a:Int = _ 
} 

class B(override var a:Int) extends A 
+1

Hai semplificare il vero e proprio caso di fare la domanda? Come sottolineato da molte risposte, è abbastanza inutile sovrascrivere una var con un'altra con lo stesso nome e tipo. –

risposta

11

Non si può ignorare che (per ragioni che non si rivelano a me in questo momento, tranne che Vars possono essere modificati in ogni caso in modo da perchè li ignorare), ma è possibile lasciare il dichiarato delegato Non inizializzato e variabile quest'ultimo di B:

trait A { 
    var a: Int 
} 

class B(var a: Int) extends A 
6

override è solo per i metodi. Non ha senso sovrascrivere una variabile. Cosa cambia se si sostituisce una variabile con un'altra variabile dello stesso tipo? Se non altro, il valore e che può solo essere impostati in qualsiasi momento in ogni caso, perché si tratta di una variabile:

trait A { 
    var a: Int = _ 
} 

class B (a0: Int) extends A { 
    a = a0 
} 

ma che non è stata riordinata ciò che si desidera. Si può anche lasciare il getter e astratto setter:

trait A { 
    def a: Int 
    def a_=(value: Int): Unit 
} 

class B(var a: Int) 

che è quindi equivalente a

trait A { 
    var a: Int 
} 
1

Nota esattamente sicuro di quello che si vorrebbe ottenere con un tentativo di "override" a "var" che, come altri hanno menzionato, puoi comunque cambiare.

Tra molte altre ipotesi, una è che si vorrebbe qualcosa come membri di tipo self? dove l'annotazione self-type ti consente di accedere ai membri di un mixin trait o classe, e il compilatore Scala garantisce che tutte le dipendenze siano cablate correttamente? Se è così, qualcosa come il seguente funzionerà.

trait B{ 
var a:Int = _ 

}

trait A{self:B=> var b= a} 
class C extends A with B