Ich habe versucht, das Double-Dispatch-Muster zu knacken und es mir schwer gefallen. Ich versuchte schließlich ein Beispielprogramm, um mir selbst zu helfen. Hier ist das Wesentliche. Aber dann habe ich beschlossen, es ohne Double-Dispatch zu versuchen und die Lösung sah nicht schrecklicher aus als sonst. Was mache ich falsch?
Bearbeiten: Ich habe, wie vorgeschlagen, diese Frage hier gestellt . Halten Sie diesen Link für Weiterleitungen bereit.
Im Einzelversand --- was Sie in den meisten modernen OO-Sprachen sehen --- eine Methode wird basierend auf dem Laufzeittyp eines einzelnen Objekts ausgelöst . Dies wird als Punktoperator (in Ruby, Java, Javascript usw.) oder als Pfeiloperator (perl, c ++) angezeigt.
%Vor%Die doppelte Verteilung würde dann auf dem Laufzeittyp von zwei -Objekten basieren. Es gibt ein paar Möglichkeiten, wie das aussehen könnte; und auf welchem Objekt soll die Methode leben?
%Vor%Sprachen wie groovy, die mehrere Dispatchs haben, verallgemeinern das zweite obige Beispiel; Sie berücksichtigen die Laufzeittypen von all -Parametern, wenn sie auswählen, welche Methode ausgeführt werden soll. Siehe zum Beispiel diesen Blogbeitrag über groovige und mehrfache Versendung.
Die meisten modernen OO-Sprachen haben nur einen einzigen Versand und das Multiple Dispatch Pattern ist ein Versuch, die Vorteile des mehrfachen Versands in die Sprache zu nutzen. Es funktioniert sogar für dynamische Sprachen wie Ruby. Es funktioniert, indem Sie einfach einmal zweimal nacheinander ausführen. Der erste Methodenaufruf ruft eine Methode für das zweite Objekt auf.
%Vor%Das Double-Dispatch -Muster nennt man ein Low-Level-Pattern, weil andere Pattern darauf aufgebaut sind. Zum Beispiel hängt das Visitor-Muster stark von dem doppelten Dispatch-Muster ab.
Update Ich habe nur deinen Kern gesehen. Ihr erster Kern ist nicht wirklich Doppel-Versand. Sicher, Sie versenden zweimal, aber Sie ändern das Verhalten in diesem zweiten Dispatch nicht. Um es in Doppelversand zu ändern, würde ich so etwas tun.
%Vor%Tags und Links ruby design-patterns