Wann sollten Sie Vererbungsmuster gegenüber Mixins in dynamischen Sprachen bevorzugen?
Mit Mixins meine ich das eigentliche richtige Einmischen, wie das Einfügen von Funktionen und Datenelementen in ein Objekt zur Laufzeit.
Wann würden Sie beispielsweise die prototypische Vererbung anstelle von Mixins verwenden? Um deutlicher zu veranschaulichen, was ich mit mixin meine, gibt es einen Pseudocode:
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
quelle
quelle
Antworten:
Die prototypische Vererbung ist einfach. Es hat einen einzigen Vorteil gegenüber Mixins.
Das heißt, es ist eine Live-Verbindung. Wenn Sie den Prototyp ändern, wird alles, was er erbt, geändert.
Beispiel mit pd
Wenn Sie also Änderungen am "Interface" -Kreis zur Laufzeit für alle Objekte vornehmen möchten, die dessen Funktionalität "nutzen", übernehmen Sie diese.
Wenn Sie nicht möchten, dass Änderungen übernommen werden, mischen Sie sie ein.
Beachten Sie, dass Mixins auch mehr Zweck haben. Mixins sind Ihr Mechanismus für die mehrfache "Vererbung".
Wenn Sie ein Objekt wollen mehrere „Schnittstellen“ implementieren , dann Sie werden in einigen mischen müssen. Die Sie für prototypische Vererbung ist , die Sie Änderungen während der Laufzeit reflektieren wollen, werden die anderen in gemischt werden.
quelle
Mein Pferdesinn sagt mir:
Verwandte Hinweise:
quelle
Verwenden Sie den "Is-a" -Test.
Die Vererbung ist auf den Fall beschränkt, in dem Sie "Unterklasse IST Eine Superklasse" sagen können. Sie sind das Gleiche. "Käse ist ein Milchprodukt".
Mixins sind für alles andere. "Käse kann in einem Sandwich verwendet werden". Käse ist kein Sandwich, aber er spielt beim Sandwiching eine Rolle.
PS. Dies hat nichts mit dynamischen Sprachen zu tun. Jede Mehrfachvererbungssprache mit statischer Kompilierung (dh C ++) hat denselben Entscheidungspunkt.
quelle
Nun, das beste Beispiel, das ich Ihnen geben kann, ist ein Schauspieler für ein Spiel, das Vererbung für einige grundlegende Dinge hat, aber Mixins / Plugins für gemeinsame Funktionen verwendet. Die geteilte Funktionalität könnte (direkt aus dem Quellcode!) Sein:
quelle