Antwort

34

OK, ich habe den subtilen Unterschied verstanden, bei dem sich die Funktionsüberlastung vom Mehrfachversand unterscheidet.

Der Unterschied besteht im Wesentlichen darin, ob die zu rufende Methode zur Laufzeit oder zur Kompilierzeit ausgewählt wird. Nun, ich weiß, jeder hat das gesagt, aber ohne ein klares Beispiel klingt das SEHR offensichtlich, wenn man bedenkt, dass C# statisch getippt ist und mehrere Dispatch-Sprachen (anscheinend zumindest für mich) dynamisch typisiert zu sein scheinen. Mit genau dieser Definition klang für mich Multi-Dispatch und Function Overloading genau gleich. Der Fall, in dem dies einen wirklichen Unterschied macht, ist, wenn Sie 2 Überladungen einer Methode haben, die sich vom Typ eines Parameters unterscheiden, aber die 2 Typen sind polymorph, und Sie rufen mit einer als höher deklarierten Referenz auf ein Objekt des unteren Typ hat ... (Wenn jemand einen besseren Weg denken kann, dies zum Ausdruck zu bringen, können Sie sich diese Antwort zu bearbeiten)

Beispiel:

int CaptureSpaceShip(IRebelAllianceShip ship) {} 
int CaptureSpaceShip(XWing ship) {} 

void Main() { 
    IRebelAllianceShip theShip = new XWing(); 
    CaptureSpaceShip(theShip); 
} 

XWing IRebelAllianceShip offensichtlich implementiert. In diesem Fall wird die erste Methode aufgerufen, während, wenn C# multiples Dispatch implementiert wäre, die zweite Methode aufgerufen würde.

Entschuldigung wegen des doc rehash ... Dies scheint mir der klarste Weg zu sein, diesen Unterschied zu erklären, anstatt nur die Definitionen für jede Versandmethode zu lesen.

Für eine formelle Erklärung: http://en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_is_more_than_function_overloading

+0

Dies ist ein schönes Beispiel für den großen Unterschied. –

+0

Danke! Ich brauchte ein Beispiel wie dieses. – John

+1

@Daniel Magliola, bitte beachten Sie, dynamische Versand ist jetzt möglich in C# 4.0 durch Verwendung von dynamischen – RichardOD

5

C# ist ein einzelner Versand, aber es gibt einige Blogposts, die nach ihrem Titel so aussehen, als würden sie Multimethoden emulieren. Wenn ich einen Artikel zum Laden bekomme, werde ich meine Antwort hier aktualisieren.

0

Das GoF-Besuchermuster ist ein Beispiel für den doppelten Versand. Scott Meyers "Effektiveres C++" zeigt Ihnen, wie man es in C++ macht. Hier ist eine link von Dr. Dobbs, die darüber spricht, wie man in Java und C++ doppelt versendet.

2

C# unterstützt keinen Mehrfachversand. Das Visitor-Design-Muster emuliert etwas, was als Mehrfach-Dispatch bezeichnet werden könnte, obwohl das Besuchermuster hauptsächlich darauf abzielt, den Algorithmus von einer Hierarchie zu trennen.

1

Nach dem cited Wikipedia article, multiple Versand per Definition basiert auf den Laufzeittypen der beteiligten Objekte, so C# und VB.net do es nicht verwenden, da die Entscheidung getroffen wird, wie Sie angeben, zur Kompilierzeit.

17

Für diejenigen, die diesen Artikel mit einer Suchmaschine finden, C# 4.0 führt das dynamic Schlüsselwort. Der Code würde wie folgt aussehen.

int CaptureSpaceShip(IRebelAllianceShip ship) {} 
int CaptureSpaceShip(XWing ship) {} 

void Main() { 
    IRebelAllianceShip theShip = new XWing(); 
    CaptureSpaceShip((dynamic)theShip); 
} 
+5

+1 . C# 4.0 unterstützt mehrere Versandvorgänge. Versionen darunter nicht – RichardOD

0

Vielleicht jemand interessiert sich für gut C# -Beispiel für mehrere Versand mit dynamischen Schlüsselwort (MSDN blog)

Wikipedia sagt, dass C# 4.0 (dynamisch) ist "Mehrfachversand" Sprache. Ich denke auch, dass Sprachen wie Java, C# (vor 4.0), C++ Single-Versand sind.