Frage

Kontext

Ich habe jetzt seit ein paar Jahren in Java programmiert. Und atm Ich lerne etwas ganz anderes: Clojure. Dort kann das Expressionsproblem durch Verwendung von Multimethods gelöst werden, während Sie in Java so etwas wie das Besuchermuster oder etwas gleich benötigen.

Die Frage

Ich habe über Multimethods gelesen und bin ziemlich verwechselt mit dem tatsächlichen Unterschied zum Überladen der Methode.

Der einzige Unterschied, den ich bisher entdeckt habe, dass ein Multimethod nicht vom Laufzeittyp des Objekts abhängt, auf dem die Methode aufgerufen wird.

War es hilfreich?

Lösung

Überladen ist, wenn zwei oder mehr Methoden denselben Namen, aber unterschiedliche Signaturen haben (unterschiedliche Argumententypen, unterschiedliche Anzahl von Argumenten). Die Überlastung wird statisch aufgelöst, abhängig von den statischen Argumenten. (Die Interaktion von Überladen und Überschreiten in Java macht beispielsweise die Geschichte etwas komplizierter.) Überladung wird statisch auf eine bestimmte Methodensignatur gelöst. Zur Laufzeit wählt der dynamische Versand dann die am besten geeignete Methode mit dieser Signatur aus.

Multimethods sind eine Sammlung von Methoden, die den gleichen Namen haben, die gleiche Anzahl von Argumenten und überlappend Geben Sie Unterschriften ein. Immer wenn ein Aufruf an ein Multimethod (unter Verwendung des Namens des Multimethod) getätigt wird, werden alle Methoden in der Sammlung als möglicher Kandidat für den Versand angesehen. Der genaue Kandidat wird je nach Laufzeittypen der Argumente ausgewählt - die spezifischste Methode wird ausgewählt. Die tatsächlichen Laufzeittypen aller Argumente werden verwendet, um zu bestimmen, welches ausgelegt werden soll, was sich vom herkömmlichen Einzelversand in Java unterscheidet, wobei nur das erste Argument (das Ziel) der Methode verwendet wird, um zu bestimmen, welcher Methodenkörper ausgeführt wird.

Andere Tipps

Soweit mein Verständnis geht:

Multimethods sind eine Verallgemeinerung des Methodenpolymorphismus.

Ein Multimethod besteht aus 2 Teilen

  1. Ein Name

  2. EIN dispatch method: die a produzieren wird dispatch value

Basierend auf diesem Versandwert wird die entsprechende Methode ausgewählt. Überladung ist ein Sonderfall von Multimethods, bei dem die Versandmethode den statischen Typ als Versandwert zurückgibt

Im Allgemeinen kann die Versandmethode alles sein. Es kann andere Werte als den Typ zurückgeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit cs.stackexchange
scroll top