2009-05-29 15 views

Odpowiedz

182
  1. Mieszanki mogą zawierać stan, (tradycyjne) cechy nie.
  2. Mieszanki używają "niejawnego rozwiązywania konfliktów", cechy używają "jawnego rozwiązywania konfliktów"
  3. Mieszanki zależą od linearyzacji, cechy są spłaszczone.

Lecture about traits

ad 1. W wstawek można zdefiniować zmienne instancji. Cechy nie pozwalają na to. Stan musi być zapewniony przez komponowanie klasy (= klasa używająca cech)

ad 2. Może być konflikt nazwy. Dwie mieszanki (MA i MB) lub cechy (TA i TB) definiują metodę o tej samej definicji 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' 
    } 
} 

W wstawek konflikty w komponowaniu klasę C mixins MA, MB są rozwiązane w sposób dorozumiany.

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

ten wezwie foo():void z MA

Z drugiej strony podczas korzystania Cechy, komponując klasa ma rozwiązywać konflikty.

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

Ten kod spowoduje zgłoszenie konfliktu (dwie definicje: foo():void).

ad 3. Semantyka metody nie zależy od tego, czy jest zdefiniowana w cechie, czy w klasie, która używa tej cechy.

Innymi słowy, nie ma znaczenia, że ​​klasa składa się z Cech lub kod Cechy jest "skopiowany - wklejony" do klasy.

+9

+1 Bardzo podobała mi się twoja odpowiedź. To było zwięzłe i bardzo wyraźnie opisało różnicę między nimi. Dziękuję Ci! – Tower

+1

Gdyby istniała lista wzorcowych odpowiedzi, to na pewno byłoby na nim. Dziękuję, jk_. – Reece

+5

Wiem, że minął rok, ale dla przyszłych czytelników, w rubinach użyłbym metody z ostatniego modułu, który został wymieszany, więc nazwałoby to foo() formą MB –

7

Te strony wyjaśniają różnicę w języku programowania D.

http://dlang.org/mixin.html

http://dlang.org/traits.html

Wstawki w tym kontekście to kod generowany w locie, a następnie umieszczony w tym punkcie w kodzie podczas kompilacji. Dość przydatny w przypadku prostych DSL.

Cechy to czasy zewnętrzne kompilacji (zamiast kodu wygenerowanego ze źródła zewnętrznego). Różnica jest subtelna. Mixiny dodają logikę, cechy dodają dane, takie jak informacje o typie kompilacji.

Nie wiem zbyt wiele o Ruby, ale mam nadzieję, że to trochę pomaga.

+35

Mixiny i cechy w D są całkowicie różne od tych, które oznaczają ogólnie w informatyce. W D oba są prymitywami preprocesora do automatycznego generowania kodu. W innych językach są to mechanizmy dziedziczenia. Decyzja nazewnictwa w D jest niefortunna. – tylerl