Miksy a cechy

Odpowiedzi:

214
  1. Miksy mogą zawierać stan, (tradycyjne) cechy nie.
  2. Miksy używają „niejawnego rozwiązywania konfliktów”, cechy używają „jawnego rozwiązywania konfliktów”
  3. Miksy zależą od linearyzacji, cechy są spłaszczane.

Wykład o cechach

ad 1. W mikserach można zdefiniować zmienne instancji. Cechy na to nie pozwalają. Stan należy podać, komponując klasę (= klasa wykorzystująca cechy)

ad 2. Może wystąpić konflikt nazw. Dwie mieszanki ( MAi MB) lub cechy ( TAi TB) definiują metodę z tą samą definicją 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 mieszankach konflikty w klasie komponującej C mixins MA, MB są rozwiązywane niejawnie.

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

To zadzwoni foo():voidodMA

Z drugiej strony, podczas korzystania z Cech, komponowanie klasy musi rozwiązywać konflikty.

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

Ten kod wywoła konflikt (dwie definicje foo():void).

ad 3. Semantyka metody nie zależy od tego, czy jest ona zdefiniowana w ramach cechy, czy w klasie, która korzysta z tej cechy.

Innymi słowy, nie ma znaczenia, czy klasa składa się z Cech, czy kod Cech jest „kopiowany - wklejany” do klasy.

jk_
źródło
5
Wiem, że minął rok, ale dla przyszłych czytelników, w Rubim użyłby metody z ostatniego modułu, który był wmieszany, więc wywołałby foo () z MB
rik.vanmechelen.
4
w Scali cechy mogą mieć pola, co oznacza, że ​​nie są to cechy „tradycyjne”?
Sergio,
4
Tak, to nie są „tradycyjne”, nazywane są cechami „stanowymi”. Różnica między cechami stanu a miksami to punkty 2 i 3.
jk_
7
Wstępnie -1; sposób, w jaki terminy „cecha” i „mieszanie” są używane w środowisku naturalnym, jest wysoce niespójne i przynajmniej jeden z tych punktów jest w większości błędny. PHP i Wikipedia (a według @Sergio, także Scala) nie zgadzają się z Tobą co do cech bezpaństwowości. Nie uważam tej odpowiedzi za przydatną, ponieważ składa się ona z czystych stwierdzeń i nie jest dla mnie jasne, że jest to coś więcej niż to, jak osobiście używasz tych słów. Aby być przekonanym, że jest inaczej, musiałbym zobaczyć wiele przykładów użycia terminów w prawdziwym świecie (np. W prawdziwych językach programowania) do tworzenia kopii zapasowych twoich twierdzeń.
Mark Amery,
3
@AykutKllic Linearyzacja -> "Kompilator rozwiązuje pytanie, czym jest super, bez niejasności." ( ibm.com/developerworks/library/j-jn8 )
ben
9

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

http://dlang.org/mixin.html

http://dlang.org/traits.html

Mixiny w tym kontekście to kod generowany w locie, a następnie wstawiany w tym miejscu w kodzie podczas kompilacji. Całkiem przydatne dla prostych DSL.

Cechy to zewnętrzne wartości czasu kompilacji (a nie kod wygenerowany z zewnętrznego źródła). Różnica jest subtelna. Miksery dodają logikę, cechy dodają dane, takie jak informacje o typie kompilacji.

Nie wiem zbyt wiele o Rubim, ale mam nadzieję, że to trochę pomoże.

Aiden Bell
źródło
41
Miksy i cechy w D są zupełnie inne od tego, co ogólnie oznaczają terminy w informatyce. W D oba są prymitywami preprocesora do automatycznego generowania kodu. W innych językach są to mechanizmy dziedziczenia. Decyzja dotycząca nazewnictwa w D jest niefortunna.
tylerl