Polymorphie
|
griechisch: Vielgestaltigkeit
|
in OOP
|
Es gibt zu einer in einer Schnittstelle oder
Klasse deklarierten Methode möglicherweise
in beerbenden Klassen verschiedene Methodenrümpfe.
|
Überladen |
heißt hier: Zu einem Methodennamen gibt es mehrere Methodenrümpfe
|
Dynamisches Binden
|
Bei einem Methodenaufruf wird die Berechnung des auszuführenden Methodenrumpfes
zur Laufzeit
in Abhängigkeit von dem Typ des Objekts gemacht.
|
|
NICHT zur Übersetzungszeit in Abhängigkeit von dem Typ der Referenz.
|
| |
|
Dieses dynamische Binden wird in Java nur auf Methoden mit gleichen formalen Parameterlisten angewendet.
|
Beispiel |
class X {
void f() { ... }
void g() { ... }
}
class Y extends X {
void f() { ... }
}
class Z extends Y {
void f() { ... }
void g() { ... }
void h() { ... }
}
X x1 = new X();
X x2 = new Y(); X x2a = new Y();
X x3 = new Z();
x1.f();
x2.f();
x3.f();
x1.g();
x2.g();
x3.g();
x1 = x2;
x1.f();
x1.h();
|
| |
|
Viele unterschiedliche Objekte mit
unterschiedlichem internem Verhalten,
aber einheitlicher Schnittstelle.
|
| |
? |
Verständlichkeit
|
| |
|
Flexibilität
|
| |
|
jeder Methodenaufruf enthält einen berechneten
Unterprogrammaufruf.
|
| |
? |
Laufzeiteffizienz
|
| |
|
Eine Indirektstufe mehr ==> mehr Flexibilität, weniger Effizienz
|
| |
? |
Implementierung
|
| |
|
|
Polymorphie |
bezieht sich hier auf Methoden mit
gleichem Namen und gleichen Parametertypen.
|
Kleinstes Beispiel
|
für dynamisches Binden
|
|
class X {
void f() { ... }
}
class Y extends X {
void f() { ... }
X x1 = new X();
X x2 = new Y();
... x1.f() ...
... x2.f() ...
|
Beispiel |
für Polymorphie, die statisch (zur Übersetzungszeit)
aufgelößt wird:
|
|
class X {
void f() { ... }
void f(String s) { ... }
}
X x1 = ...;
... x1.f() ...
... x1.f("abc") ...
|
|
Aufrufe von Methoden mit gleichem Namen aber unterschiedlicher Parameterliste
werden statisch an Hand der Anzahl der Parameter und der Typen der Parameter unterschieden.
|