Kiedy wolisz wzorce dziedziczenia niż miksy w dynamicznych językach?
Przez mixiny mam na myśli faktyczne właściwe wkomponowanie, tak jak wstawianie funkcji i elementów danych do obiektu w czasie wykonywania.
Kiedy użyjesz na przykład dziedziczenia prototypowego zamiast mixin? Aby lepiej zilustrować, co rozumiem przez mixin, pseudokod:
asCircle(obj) {
obj.radius = 0
obj.area = function() {
return this.radius * this.radius * 3.14
}
myObject = {}
asCircle(myObject)
myObject.area() // -> 0
javascript
inheritance
mixins
Magnus Wolffelt
źródło
źródło
Odpowiedzi:
Dziedziczenie prototypowe jest proste. Ma jedną przewagę nad mixinami.
To znaczy, że jest to link na żywo. jeśli zmienisz prototyp, wszystko, co go odziedziczy, zostanie zmienione.
Przykład użycia pd
Zasadniczo więc jeśli chcesz, aby zmiany w kręgu „interfejsu” były odzwierciedlane w czasie wykonywania dla wszystkich obiektów, które „używają” jego funkcjonalności, to dziedzicz po niej.
Jeśli nie chcesz, aby zmiany odzwierciedlały, zmieszaj je.
Zauważ, że mixiny mają również większy cel. Mixiny są twoim mechanizmem wielokrotnego „dziedziczenia”.
Jeśli chcesz, aby obiekt zaimplementował wiele „interfejsów”, będziesz musiał je wmieszać. Ten, którego używasz do dziedziczenia prototypowego, to ten, dla którego zmiany mają być odzwierciedlone w czasie wykonywania, inne zostaną zmieszane.
źródło
Mój zmysł konia mówi mi to:
Powiązane uwagi:
źródło
Użyj testu „Is-a”.
Dziedziczenie ogranicza się do przypadku, gdy można powiedzieć „podklasa jest superklasą”. Są tego samego rodzaju. „Ser to produkt mleczny”.
Mixiny są do wszystkiego innego. „Ser może być stosowany w kanapce”. Ser nie jest kanapką, ale bierze udział w kanapce.
PS. Nie ma to nic wspólnego z dynamicznymi językami. Każdy język dziedziczenia wielokrotnego ze statyczną kompilacją (tj. C ++) ma ten sam punkt decyzji.
źródło
Cóż, najlepszym przykładem, jaki mogę ci dać, jest aktor dla gry, która ma dziedzictwo dla niektórych podstawowych rzeczy, ale używa mixin / wtyczek do wspólnej funkcjonalności. Współużytkowana funkcjonalność może być (bezpośrednio z kodu źródłowego!):
źródło