Polymorphie (griechisch „Vielgestaltigkeit") ist ein Kernprinzip der Objektorientierung: Derselbe Methodenaufruf kann je nach tatsächlichem Objekt unterschiedlich reagieren. Der Aufrufer kennt nur die gemeinsame Schnittstelle, nicht die konkrete Implementierung.
Überschreiben (Overriding)
Eine Unterklasse erbt Methoden ihrer Oberklasse und ersetzt sie durch eine eigene Version. Entscheidend: Zur Laufzeit entscheidet der tatsächliche Typ des Objekts, welche Version läuft — nicht der Typ der Variablen (dynamische Bindung).
class Tier:
def laut(self):
return "..."
class Hund(Tier):
def laut(self):
return "Wuff!"
class Katze(Tier):
def laut(self):
return "Miau!"
for t in [Hund(), Katze()]:
print(t.laut())
Beide Objekte sind vom Typ Tier, aber jeder Aufruf von laut() liefert das tierartige Geräusch. Genau dafür stehen Interfaces und abstrakte Klassen: Sie legen den Vertrag fest, die Unterklassen füllen ihn aus.
Überladen (Overloading)
Beim Überladen tragen mehrere Methoden denselben Namen, unterscheiden sich aber in Anzahl oder Typ der Parameter. Java und C++ wählen beim Compilieren die passende Variante; Python simuliert Überladen über Default-Parameter oder *args.
Beziehung zur Kapselung
Polymorphie funktioniert nur, wenn die Innereien eines Objekts nicht von außen sichtbar sind — sonst könnte der Aufrufer nicht zwischen Implementierungen wechseln. Die Kapselung schützt den Zustand, die Polymorphie vereinheitlicht den Zugriff.
Wo Polymorphie überall steckt
- Callback-Funktionen: Eine Funktion verhält sich je nach übergebener Funktion unterschiedlich — Callback und Lambda sind praktische Polymorphie
- Design Patterns: Strategie, Factory und Observer leben von austauschbaren Implementierungen
- Testen: Mocks ersetzen echte Abhängigkeiten über dieselbe Schnittstelle
Grundlagen: Klasse, Objekt, Methode und Objektorientierung im Überblick.