Menu
Coddy logo textTech

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.

Von Kevin Spektor, Mitgründer & CTO

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

ArtAuch genanntWie sie aussiehtWann die Version gewählt wird
SubtypLaufzeitpolymorphie, Überschreiben von MethodenEine Unterklasse ersetzt eine Methode ihrer ElternklasseWährend das Programm läuft
Ad hocÜberladenEin Name, mehrere Versionen für verschiedene Parametertypen; auch das Überladen von OperatorenBeim Kompilieren in Java und C++
ParametrischGenerics, TemplatesEin 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?
Der Operator + 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?
Vererbung lässt eine Klasse den Code einer Elternklasse wiederverwenden. Polymorphie lässt Code verschiedene Typen über eine gemeinsame Schnittstelle behandeln. Vererbung ist ein üblicher Weg zur Polymorphie, weil eine Unterklasse eine Methode der Elternklasse überschreiben kann, aber Duck Typing in Python und Interfaces in Java liefern Polymorphie, ohne Code zu teilen.
Was ist Polymorphie in der Biologie?
In der Biologie bedeutet Polymorphie, dass in derselben Population zwei oder mehr Ausprägungen eines Merkmals oder eines Gens vorkommen, etwa die Blutgruppen A, B, AB und 0 beim Menschen. Sie teilt die griechische Wurzel, "viele Formen", mit dem Begriff aus der Programmierung, aber die beiden Konzepte haben nichts miteinander zu tun.
Unterstützt Python das Überladen von Methoden?
Nicht nach Typ oder Anzahl der Parameter, wie Java und C++ es tun. Ein zweites 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?
Sie lässt dich neue Typen hinzufügen, ohne den Code zu ändern, der sie verwendet. Ein Zeichenprogramm, das 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.
Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S