2009-11-26 3 views

Antwort

49

Methode Überlastung bei der Kompilierung aufgelöst wird.

Mehrfachversand wird zur Laufzeit gelöst.

Bei Verwendung von Double Dispatch hängt die aufgerufene Methode vom tatsächlichen Empfängertyp und den Argumenten ab. Das Überladen von Methoden erlaubt jedoch nur, dass die aufgerufene Methode vom deklarierten Typ der Parameter abhängt. Warum? Java bindet Methodenaufrufe zur Kompilierzeit mit ihrer vollständigen Signatur (frühe Bindung). Die vollständige Signatur enthält alle Parametertypen. Wenn der tatsächliche Typ eines Arguments zur Laufzeit anders ist (Polymorphismus), funktioniert das Überladen nicht wie erwartet!

void add(Foo o) { ... } 
void add(Bar o) { ... } 
void client() { 
    Foo o = new Bar(); 
    add(o); // calls add(Foo) not add(Bar)! 
} 

mehrere Dispatch jedoch

void add(Foo o) { o.dispatch(this); } 
void add(Bar o) { o.dispatch(this); } 
void client() { 
    Foo o = new Bar(); 
    add(o); // calls #dispatch as defined in Bar! 
} 

Dinge mit in Scala etwas anders sein könnte, obwohl die allgemeine Unterscheidung hier das gleiche wie dargestellt in allen Programmiersprachen sein sollte.

+0

Danke für das tolle Beispiel. – shj

Verwandte Themen