2009-05-29 35 views

risposta

182
  1. Le miscele possono contenere caratteristiche di stato (tradizionali) no.
  2. I mixins utilizzano "risoluzione implicita dei conflitti", i caratteri utilizzano "risoluzione esplicita dei conflitti"
  3. I mixini dipendono dalla linearizzazione, i tratti sono appiattiti.

Lecture about traits

annuncio 1. In mixins è possibile definire variabili di istanza. I tratti non lo consentono. Lo stato deve essere fornita da comporre classe (= classe utilizzando i tratti)

ad 2. Ci può essere il nome conflitto. Due mixin (MA e MB) o tratti (TA e TB) definiscono il metodo con la stessa definizione foo():void.

Mixin MA { 
    foo():void { 
     print 'hello' 
    } 
} 

Mixin MB { 
    foo():void { 
     print 'bye' 
    } 
} 

Trait TA { 
    foo():void { 
     print 'hello' 
    } 
} 

Trait TB { 
    foo():void { 
     print 'bye' 
    } 
} 

In mixins i conflitti in composizione di classe C mixins MA, MB sono risolti in modo implicito.

Class C mixins MA, MB { 
    bar():void { 
     foo(); 
    } 
} 

Ciò richiederà foo():void da MA

D'altra parte durante l'utilizzo Tratti, componendo classe ha per risolvere i conflitti.

Class C mixins TA, TB { 
    bar():void { 
     foo(); 
    } 
} 

Questo codice genererà conflitto (due definizioni di foo():void).

annuncio 3. La semantica di un metodo non dipende dal fatto che è definito in un tratto o in una classe che utilizza il tratto.

In altre parole, non importa se la classe è composta dai Tratti o il codice Tratti è "copiato - incollato" nella classe.

+9

+1 Mi è piaciuta molto la tua risposta. Era conciso e descriveva la differenza tra i due molto chiaramente. Grazie! – Tower

+1

Se ci fosse una lista di risposte esemplari, questo sarebbe sicuramente su di esso. Grazie, jk_. – Reece

+5

So che è una data di un anno, ma per i futuri lettori, in ruby ​​userebbe il metodo dall'ultimo modulo che è stato mescolato, quindi chiamerebbe foo() modulo MB –

7

Queste pagine spiegano la differenza nel linguaggio di programmazione D.

http://dlang.org/mixin.html

http://dlang.org/traits.html

Mixin in questo contesto sono codice generato al volo, e quindi inseriti in quel punto nel codice durante la compilazione. Abbastanza utile per semplici DSL.

I tratti sono valori esterni in fase di compilazione (anziché codice generato da una fonte esterna). La differenza è sottile. I mixaggi aggiungono logica, i tratti aggiungono dati come informazioni sul tipo in fase di compilazione.

Non so molto di Ruby, ma spero che questo aiuti un po '.

+35

Mixins e Tratti in D sono completamente diversi da ciò che i termini significano in Computer Science in generale. In D, entrambi sono preprocessori primitivi per la generazione automatica di codice. In altre lingue, sono meccanismi di ereditarietà. La decisione di nominare in D è sfortunata. – tylerl