2014-05-05 13 views
6

Diciamo che ho il codice come questo:Mixin passare in secondo piano

class A{ foo() => "A";} 
class B{ foo() => "B";} 
class C{ foo() => "C";} 

class Mix extends A with B,C { 
    foo() => "MIX"; 
    bar() => super.foo(); 
} 

class MessABC = Object with A,B,C; 
class MessBCA = Object with B,C,A; 
class MessCAB = Object with C,A,B; 

void main() { 
    Mix mix = new Mix(); 
    MessABC mABC = new MessABC(); 
    MessBCA mBCA = new MessBCA(); 
    MessCAB mCAB = new MessCAB(); 

    print("Mix.foo = ${mix.foo()} Mix.bar = ${mix.bar()} \n" 
     "mABC.foo = ${mABC.foo()} \n" 
     "mBCA.foo = ${mBCA.foo()} \n" 
     "mCAB.foo = ${mCAB.foo()} \n"); 

} 

L'uscita

Mix.foo = MIX Mix.bar = C
mABC.foo = C
MBCA .foo = A
mCAB.foo = B

Sull'oggetto mix posso chiamare sia Mix.foo e C.foo con la eccellente(in realtà mi aspettavo A.foo) Ma si può in qualche modo chiamare A.foo e B.foo?

Anche io sono un po 'confuso dal con la semantica. A,B,C Sembra "enumerazione di un rango" ma l'ordine è importante. E "Dart Editor" non mi avvisa della collisione del nome. Forse posso abilitare questo avvertimento?

Per me sembra qualcosa che ti rende confuso e incline agli errori.

risposta

7

L'applicazione di miscelazione viene elaborata da sinistra a destra.

La superclasse di Object with A,B,C è Object with A,B, comprendente i seguenti superclassi Object with A e poi Object.

Le regole prevalenti per i mixin sono le stesse delle superclassi non-mixin. Il tuo C.foo in Mix ignora quelli ereditati da A e B, così Mix.bar s' super.foo() raggiunge solo il C.foo, e non c'è modo di accedere A.foo o B.foo.

L'override è perfettamente a posto e non causa alcun avvertimento, a condizione che i metodi abbiano firme compatibili.

La descrizione più approfondita di mixins è ancora https://www.dartlang.org/articles/mixins/

+0

Ora ci si sente ovvio. Grazie :) – JAre

Problemi correlati