In Ruby ist der Grund, dass Mixins keine Mehrfachvererbung sind, dass die Kombination von Mixin-Methoden eine einmalige Sache ist.Dies wäre kein so großes Problem, außer dass die Module und Klassen von Ruby offen sind für Änderungen. Dies bedeutet, dass wenn Sie ein Modul zu Ihrer Klasse hinzufügen und dann eine Methode zum Modul hinzufügen, die Methode nicht für Ihre Klasse verfügbar ist; Wenn du es in umgekehrter Reihenfolge machst, würdest du es tun.
Es ist wie eine Eistüte zu bestellen. Wenn du Schokostreusel und Toffeestückchen als deine Mixins bekommst und mit deinem Kegel weggehst, was für eine Eistüte du hast, wird sich nicht ändern, wenn jemand mehrfarbige Streusel in die Schokostreusel-Kiste in der Eisdiele gibt. Ihre Klasse, die Eistüte, wird nicht verändert, wenn das Mixin-Modul, der Bin der Streusel, ist. Die nächste Person, die dieses Mixmodul verwendet, sieht die Änderungen.
Wenn Sie include
ein Modul in Ruby, ruft es Module#append_features
auf diesem Modul, die eine Kopie der Methoden dieses Moduls zum Includer einmal hinzufügen.
Mehrfachvererbung, wie ich es verstehe, ist eher wie Delegation. Wenn deine Klasse nicht weiß, wie sie etwas tun soll, fragt sie ihre Eltern. In einer offenen Klassenumgebung wurden die übergeordneten Elemente einer Klasse möglicherweise geändert, nachdem die Klasse erstellt wurde.
Es ist wie eine RL Eltern-Kind-Beziehung. Vielleicht hat deine Mutter gelernt, wie man jongliert, nachdem du geboren wurdest, aber wenn dich jemand bittet, zu jonglieren, und du sie entweder darum bittest: zeige dir wie (kopiere es, wenn du es brauchst) oder tu es für dich (reine Delegation), dann sie Ich werde zu diesem Zeitpunkt in der Lage sein, obwohl Sie erstellt wurden, bevor sie jonglieren konnte.
Es ist möglich, dass Sie ein Rubin-Modul ändern könnten ‚umfassen‘ mehr wie Mehrfachvererbung zu handeln, indem Module#append_features
Modifizieren eine Liste von includers zu halten, und dann den method_added
Rückruf mit ihnen zu aktualisieren, aber das ist eine große Verschiebung wäre aus Standard-Ruby, und könnte bei der Arbeit mit anderen Code große Probleme verursachen. Sie könnten besser eine Module#inherit
Methode erstellen, die include
aufgerufen und Delegierung behandelt.
Wie für ein reales Beispiel ist Enumerable
genial. Wenn Sie in Ihrer Klasse #each
definieren und Enumerable
in Ihre Klasse aufnehmen, dann haben Sie damit Zugriff auf eine ganze Reihe von Iteratoren, ohne dass Sie jede einzelne programmieren müssen.
Es ist lustig zu sehen, dass die [Sprache-agnostic] und [Ruby] -Tags direkt nebeneinander sitzen wie sie beste Freunde sind =) – Oli
gut Ruby löste die Frage, aber Mixin und Züge können in anderen Sprachen gemacht werden, als es ist eher ein Muster Ich denke, –