2010-05-05 34 views
8

Dati due tratti indipendenti:Composizione tratti indipendenti

trait T1 { 
    def x = 42 
} 

trait T2 { 
    def x = 0 
} 

Se provo a definire una miscelazione di classe in questi due tratti come:

class C extends T1 with T2 

ottengo un errore di compilazione:

error: overriding method x in trait T1 of type => Int; 
method x in trait T2 of type => Int needs `override' modifier 
class C extends T1 with T2 
    ^
one error found 

Supponiamo ora che T1 e T2 siano stati sviluppati in modo indipendente, quindi non eseguire l'override in quanto non sovrascrivono nulla. Come può essere definito C allora? Come questo:

class C extends T1 with T2 { 
    override def x = super.x 
} 

?

risposta

10

Questo è noto come diamond problem. In Scala ci sono due modi per risolvere questo:

trait T1 { 
    def x = 0 
} 

trait T2 { 
    def x = 42 
} 

class C extends T1 with T2 { 
    override def x = super.x 
} 

class D extends T2 with T1 { 
    override def x = super.x 
} 

Se si chiama new C().x ora, si otterrà 42 perché Scala usa la realizzazione del tratto che si mescolato in ultima. new D().x produrrà 0 a proposito. Ciò significa che per risolvere il problema dei diamanti, è necessario definire esplicitamente quale implementazione si desidera utilizzare.

L'altro modo è la seguente:

trait T { 
    def x: Int 
} 

trait T1 extends T { 
    override def x = 0 
} 

trait T2 extends T { 
    override def x = 42 
} 

class C extends T1 with T2 

Una chiamata a new C().x verrà comunque resa 42 perché T2 è l'ultimo tratto misto in La differenza è che non c'è bisogno di definire x in C..

+0

Questo è interessante. Se le due definizioni di 'x' in' T1' e 'T2' hanno tipi diversi, sembra essere un problema inevitabile. Esiste un modo intelligente in Scala per correggere questi conflitti di nomi se i tipi non corrispondono? – Mike

+0

Usa il mio primo esempio e poi definisci 'C' come segue:' la classe C estende T1 con T2 {override def x = super [T1] .x} '. Naturalmente, puoi anche chiamare 'super [T2] .x'. –