Was ist Polymorphie?
In der Programmierung ist Polymorphie die Fähigkeit eines Stücks Code, etwa eines Funktionsaufrufs oder eines Methodennamens, mit Werten verschiedener Typen zu arbeiten, wobei jeder Typ sein eigenes Verhalten mitbringt. Der Aufruf shape.area() führt für einen Kreis eine andere Berechnung aus als für ein Quadrat.
Aktualisiert am 24. September 2026
In Python gibt len("hello") den Wert 5 zurück, len([4, 8, 15]) den Wert 3 und len({"a": 1}) den Wert 1. Es ist ein Funktionsname für drei Typen, und jeder Typ zählt auf seine Weise: Ein String zählt Zeichen, eine Liste Elemente, ein Dictionary Schlüssel. Das Wort kommt aus dem Griechischen: poly, viele, und morph, Form. Ein Aufruf, viele Formen von Verhalten.
Wie Polymorphie funktioniert
Code ruft eine Methode über ihren Namen auf, etwa shape.area(). Wenn diese Zeile läuft, sieht sich die Sprache das tatsächliche Objekt an und findet area in der Klasse dieses Objekts. Diese Suche heißt dynamische Bindung (Dynamic Dispatch), und sie ist der Grund, warum eine Zeile für verschiedene Objekte verschiedene Arbeit erledigen kann:
Circle 3.14
Square 9
Circle 12.57
Python findet die Methode, indem es zuerst die Klasse des Objekts durchsucht und dann ihre Elternklassen in einer festen Reihenfolge, der Method Resolution Order. Hätte Square kein eigenes area(), würde die Suche bei Shape.area() landen und NotImplementedError werfen, ein Signal, dass jede Unterklasse eine eigene Methode liefern muss.
Die Schleife prüft nie, welche Art Form sie gerade hat. Um ein Dreieck hinzuzufügen, schreibst du eine Klasse Triangle mit ihrem eigenen area(), und die Schleife funktioniert unverändert. Ohne Polymorphie bräuchte die Schleife für jede Form einen if isinstance(...)-Zweig, der bei jeder neuen Form angepasst werden müsste.
Arten von Polymorphie
| Art | Auch genannt | Wie sie aussieht | Wann die Version gewählt wird |
|---|---|---|---|
| Subtyp | Laufzeitpolymorphie, Überschreiben von Methoden | Eine Unterklasse ersetzt eine Methode ihrer Elternklasse | Während das Programm läuft |
| Ad hoc | Überladen | Ein Name, mehrere Versionen für verschiedene Parametertypen; auch das Überladen von Operatoren | Beim Kompilieren in Java und C++ |
| Parametrisch | Generics, Templates | Ein Stück Code, das für jeden Typ funktioniert: List<T> in Java, vector<T> in C++ | Beim Kompilieren |
Wer in der objektorientierten Programmierung ohne weitere Angaben von "Polymorphie" spricht, meint fast immer die erste Zeile: Subtyp-Polymorphie durch Überschreiben.
Python hat alle drei auf seine eigene Art. Überschreiben funktioniert wie im Beispiel mit den Formen. Operatoren wie + sind Ad-hoc-Polymorphie. Funktionen wie max() und sorted() sind dem Geist nach parametrisch: Sie akzeptieren eine Liste von Zahlen, Strings oder Datumswerten, solange sich die Elemente vergleichen lassen, und Type Hints wie list[int] oder eine TypeVar können das ausdrücklich festhalten.
Polymorphie zur Kompilierzeit und zur Laufzeit in Java
Java hat beide Arten, und in Vorstellungsgesprächen wird oft nach dem Unterschied gefragt:
class Animal { String sound() { return "..."; } }
class Dog extends Animal {
@Override String sound() { return "Woof"; }
}
Animal pet = new Dog();
pet.sound(); // "Woof": chosen at run time from the object
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
add(2, 3); // int version, chosen by the compiler
add(2.5, 1.0); // double version
Die Variable pet hat den Typ Animal, trotzdem läuft die Version von Dog, weil die Wahl vom Objekt abhängt, nicht von der Variablen. Die beiden add-Methoden sind Überladung: Der Compiler wählt eine anhand der Argumenttypen aus, bevor das Programm läuft. Interfaces liefern dasselbe Laufzeitverhalten, ohne Code zu teilen: Jede Klasse, die Comparable implementiert, lässt sich mit Collections.sort sortieren. C++ funktioniert genauso, mit einem Unterschied: Eine Methode bekommt nur dann dynamische Bindung, wenn sie als virtual deklariert ist. Siehe Polymorphie in Java, Überladen von Methoden und virtuelle Funktionen in C++.
Polymorphie in Python: Duck Typing und Operatoren
Python verlangt keine gemeinsame Elternklasse. Hat ein Objekt die Methode, die der Code aufruft, funktioniert es: "Wenn es läuft wie eine Ente und quakt wie eine Ente, ist es eine Ente". Auch Operatoren sind polymorph. a + b ruft a.__add__(b) auf, also können deine eigenen Klassen +, len() und print() unterstützen:
3 abcd [1, 2]
Vector(11, 22)
5 3 2
Vererbung ist ein Weg zur Polymorphie, keine Voraussetzung. Vector erbt von nichts Besonderem, und trotzdem behandeln len() und + die Klasse wie einen eingebauten Typ. Die Doku zur Vererbung in Python zeigt den Weg über Unterklassen.
Häufige Fehler
Erwarten, dass Python nach Signatur überlädt. Ein zweites def mit demselben Namen ersetzt das erste stillschweigend:
Hi Ana Silva
Traceback (most recent call last):
...
TypeError: greet() missing 1 required positional argument: 'last'
Verwende stattdessen ein Standardargument: def greet(first, last="").
virtual in C++ vergessen. Ohne das Schlüsselwort führt ein Methodenaufruf über einen Zeiger auf die Basisklasse die Version der Basisklasse aus, selbst wenn das Objekt eine Unterklasse ist.
Überschreibungen, die die Bedeutung ändern. Gibt area() in einer Unterklasse den Umfang zurück, geht jeder Aufrufer kaputt, der sich auf area() verlässt. Eine Überschreibung muss das Versprechen der Elternklasse halten; diese Regel heißt Liskovsches Substitutionsprinzip.
Typprüfungen überall. Eine Kette von if type(x) == ...-Zweigen ist meist ein Zeichen, dass jeder Typ stattdessen seine eigene Methode mitbringen sollte.
Wie es weitergeht
Polymorphie arbeitet mit Kapselung zusammen, die die Daten jedes Objekts schützt, und mit Abstraktion, die die gemeinsame Schnittstelle festlegt, die die Typen umsetzen. Üb das Überschreiben mit der Doku zu Python-Klassen, oder probier den Java-Kurs, in dem Überladen und Überschreiben nebeneinander vorkommen.
Häufig gestellte Fragen
Was ist ein Beispiel für Polymorphie?
+ in Python: 1 + 2 addiert Zahlen, "ab" + "cd" verbindet Strings und [1] + [2] verbindet Listen. Dasselbe Symbol funktioniert mit drei Typen, und jeder Typ entscheidet, was es bedeutet. In objektorientiertem Code ist das klassische Beispiel eine Liste von Formen, in der jede Form area() mit ihrer eigenen Formel beantwortet.Was ist der Unterschied zwischen Polymorphie und Vererbung?
Was ist Polymorphie in der Biologie?
Unterstützt Python das Überladen von Methoden?
def mit demselben Namen ersetzt das erste. Python-Code erreicht dieselbe Wirkung mit Standardargumenten, *args oder functools.singledispatch, das eine Funktion anhand des Typs des ersten Arguments auswählt.Wozu ist Polymorphie nützlich?
shape.draw() für jede Form aufruft, braucht keine Änderung, wenn du eine Dreiecksklasse hinzufügst; nur die neue Klasse wird geschrieben. Ohne Polymorphie bekäme diese Schleife für jeden Typ einen neuen if-Zweig.