2009-02-10 14 views

Antwort

15

Nr

dynamisch Dispatch - Die aktuelle Methodengruppe/Unterschrift/Override-Kette bei der Kompilierung gebunden ist. Die aufgerufene Methode hängt vom tatsächlichen Laufzeittyp des Objekts ab, es findet jedoch keine tatsächliche Interpretation statt. Es wird immer noch eine Version der statisch gebundenen Methode sein.

Hier ist ein Beispiel in C#.

class Foo { 
    public override string ToString() { return "foo's ToString"; } 
} 

void Example(object p1) { 
    p1.ToString(); 
} 

Der Aufruf von p1.ToString ist ein Beispiel für dynamische Versendung. Der Code bindet statisch an die Methode ToString. Es ist jedoch eine virtuelle Methode, so dass der eigentliche aufgerufene .ToString() zur Laufzeit nicht bekannt ist, aber es ist garantiert eine .ToString() -Methode aufzurufen. Es wird der ToString des tatsächlichen Typs von p1 sein. Wenn also p1 tatsächlich eine Instanz von Foo ist, wird Foo :: ToString aufgerufen.

Dynamische Bindung - Die tatsächliche Methode ist zur Laufzeit gebunden und unterliegt der Interpretation basierend auf der Semantik des Sprach- oder Reflektions-Frameworks. Dies kann aufgrund einer Unfähigkeit zum Binden fehlschlagen.

Beispiel:

void CallBar(object o) { 
    var method = o.GetType().GetMethod("Bar"); 
    method.Invoke(new object[] {o}); 
} 

In diesem Fall sind versuchen wir die Methode "Bar" auf das betreffende Objekt aufzurufen. Das Schlüsselwort versucht. Es ist durchaus möglich, dass "Bar" auf dem Objekt nicht existiert. Dies wird jedoch zur Laufzeit durch dynamische Bindung an die Methode "Bar" bestimmt.

Das, was sie am meisten gemeinsam haben, ist, dass beide Operationen (wahrscheinlich) vom Laufzeittyp des Objekts abhängen.

EDIT

Added einige weitere Beispiele auf Antrag des OP

+0

Ich bin mir nicht sicher, ob ich dem folge, was du sagst. Ich denke, es würde helfen, wenn Sie genau definieren würden, was Sie mit den Begriffen verbindlich und versandt meinen. (Versendet keinen Methodenaufruf, in diesem Fall kommt es irgendwann in der dynamischen Bindung zu einer Sprung-/Aufrufanweisung, die eine Aufgabe ist ??) –

+0

Einige Beispiele hinzugefügt, um das Problem zu beheben – JaredPar

+0

Laut diesem Artikel: http : //citeseerx.ist.psu.edu/viewdoc/summary? doi = 10.1.1.33.4292 "Der Mechanismus, der die dynamische Bindung implementiert, wird dynamischer Versand genannt." Demnach ist JaredPar falsch. – cvogt

3

Dynamische Versand oder die dynamische Bindung bedeutet, dass beim Aufrufen einer Methode, die tatsächliche Implementierung der Methode der Wahl geschieht auszuführen, während das Programm läuft , da statisch nicht genügend Informationen verfügbar sind. Es basiert auf dem Methodennamen, dem tatsächlichen Empfängertyp (Subtyp-Polymorphismus) und/oder den tatsächlichen Argumenttypen (Überladung) oder sogar noch mehr ausgefallenem Mustervergleich.

Dynamische Bindung ist laut Wikipedia eine Form des dynamischen Versands in OO-Sprachen, in der die tatsächliche Methode zum Aufrufen auf dem Namen des Vorgangs und des tatsächlichen Empfängers zur Laufzeit basiert.

This article führt statisch typisierte dynamische Bindung ein (dynamische Bindung, die vom statischen System unterstützt wird) und dynamische Bindung, die zur Laufzeit vollständig ausgeführt wird. Es behandelt das Überladen auch als eine Form der dynamischen Bindung.

Ich bin sicher, dass Sie viele andere Artikel finden können, die über dynamischen Versand oder Bindung sprechen. Soweit ich das beurteilen kann, ist die Terminologie nicht festgelegt und "überladen". Es ist am besten zu beschreiben, , was tatsächlich zur Laufzeit passiert (der genaue Prozess, wie eine bestimmte Methode ausgewählt wird), anstatt zu versuchen, einen dieser beiden Begriffe korrekt zu definieren.