Odpowiedz

34

OK, rozumiem subtelną różnicę, w której przeciążanie funkcji różni się od wielokrotnego wysyłania.

Zasadniczo różnica polega na tym, która metoda wywołania jest wybierana w czasie wykonywania lub podczas kompilacji. Teraz wiem, że wszyscy to powiedzieli, ale bez wyraźnego przykładu brzmi to BARDZO oczywiste, biorąc pod uwagę, że C# jest statycznie wpisane i wydaje się, że języki z wieloma wysyłkami (podobno przynajmniej dla mnie) są napisane dynamicznie. Do tej pory, z tą właśnie definicją, przeciążanie wielokrotnych wysyłek i funkcji brzmiało dokładnie tak samo dla mnie.

Przypadku, w którym robi to dużą różnicę, to gdy masz 2 przeciążenia metody, które różnią się typem parametru, ale 2 typy są polimorficzne i wywołujesz z referencją zadeklarowaną jako wyższy typ, który ma przedmiot dolnej typu ... (Jeśli ktoś może pomyśleć o lepszym sposobem, aby wyrazić to, proszę czuć się swobodnie edytować tę odpowiedź)

Przykład:

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

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

XWing oczywiście implementuje IRebelAllianceShip. W tym przypadku zostanie wywołana pierwsza metoda, natomiast jeśli C# zaimplementowano wielokrotną wysyłkę, zostanie wywołana druga metoda.

Przepraszam za ponowne czytanie dokumentu ... Wydaje mi się, że jest to najczystszy sposób wyjaśnienia tej różnicy, a nie tylko przeczytania definicji dla każdej metody wysyłki.

na bardziej formalne wyjaśnienie: http://en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_is_more_than_function_overloading

+0

To jest ładny przykład głównej różnicy. –

+0

Dzięki! Potrzebowałem takiego przykładu. – John

+1

@ Daniel Magliola, proszę zauważyć, że dynamiczna wysyłka jest teraz możliwa w języku C# 4.0 z wykorzystaniem dynamicznego – RichardOD

5

C# to pojedyncza wysyłka, ale jest kilka postów na blogu, które według ich tytułu wyglądają tak, jakby próbowały emulować multimetody. Jeśli uda mi się załadować jeden z artykułów, zaktualizuję swoją odpowiedź tutaj.

0

Wzór wizytówki GoF jest przykładem, jak wykonać podwójną wysyłkę. Scott Meyers "Bardziej efektywny C++" pokazuje, jak to zrobić w C++. Oto link od Dr Dobbs, który mówi o tym, jak wykonać podwójną wysyłkę zarówno w Javie, jak iw C++.

2

C# nie obsługuje wielokrotnej wysyłki. Wzorzec projektu odwiedzającego emuluje coś, co można opisać jako wielokrotną wysyłkę, nawet jeśli wzorzec Odwiedzający koncentruje się głównie na oddzieleniu algorytmu od hierarchii.

1

Według cited Wikipedia article, stwardnienie wysyłkowy, z definicji, jest oparta na typach obiektów runtime zaangażowanych, więc C# i VB.net nie go używać, ponieważ jest wykonana decyzja, jak stwierdzić, podczas kompilacji.

17

Dla tych, którzy uważają ten artykuł za pomocą wyszukiwarki, C# 4.0 wprowadzono słowa kluczowego dynamic. Kod będzie wyglądał następująco.

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

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

+1 . C# 4.0 obsługuje wiele wysyłek. Wersje poniżej tego nie – RichardOD

0

Może ktoś będzie zainteresowany dobrym C# przykładem wielokrotnej wysyłki za pomocą dynamicznego słowa kluczowego (MSDN blog)

Wikipedia mówi, że C# 4.0 (dynamiczny) jest językiem "wielu wysyłek". Myślę też, że języki takie jak Java, C# (przed 4.0), C++ są pojedynczą wysyłką.

Powiązane problemy