Wikipedia · einfach zusammengefasst · Stand
Dynamische Bindung
Der Begriff dynamische Bindung (englisch dynamic binding) bezeichnet die verzögerte Bindung eines Namens an ein Objekt, das diesen Namen implementiert; …
Inhalt5 Abschnitte
Grundidee und Bedeutung
Dynamische Bindung (englisch dynamic binding) bedeutet, dass ein Name erst zur Laufzeit an das Objekt gebunden wird, das diesen Namen implementiert. Die Zuordnung zu einer konkreten Variablen, Funktion oder Methode erfolgt also erst bei der Ausführung einer Anweisung.
Sie ist allgemein eine Eigenschaft schwach typisierter Programmiersprachen, wird inzwischen aber auch in streng typisierten Sprachen verwendet. In der objektorientierten Programmierung ist sie wichtig, weil sie erlaubt, Verhalten in einer Basisklasse allgemein oder abstrakt zu beschreiben und es in abgeleiteten Klassen jeweils passend zu implementieren.
Polymorphe Methoden zur Laufzeit
Bei einer Klassenhierarchie kann eine Variable mit einem festgelegten Typ einer Basisklasse auch ein Objekt einer abgeleiteten Klasse referenzieren. Hat diese abgeleitete Klasse eine Methode der Basisklasse überschrieben, entscheidet sich erst beim Methodenaufruf, welche Implementierung ausgeführt wird.
Eine polymorphe oder virtuelle Methode wird daher anhand des tatsächlichen Objekttyps ausgewählt: Zuerst wird beim Aufruf der konkrete Typ beziehungsweise die Klasse des Objekts ermittelt, danach wird die passende Methodenimplementierung aufgerufen. Methodenüberladung ist eine zentrale Funktionalität der Polymorphie.
Klassen können festlegen, dass Methoden nicht überschrieben werden dürfen, etwa mit final in C++, oder überschrieben werden müssen, etwa bei rein-virtuellen Methoden einer C++-Basisklasse. Eine abstrakte Basisklasse kann so ein Interface aus polymorphen Methoden festlegen, ohne selbst zwingend eine Implementierung anzugeben. Instanziierungsfähig ist eine Klasse erst, wenn sie alle polymorphen Methoden einschließlich der geerbten Methoden implementiert.
Nicht polymorphe Methoden sind statisch gebundene Methoden. In vielen objektorientierten Sprachen lässt sich für jede Methode einzeln wählen, ob sie statisch oder dynamisch gebunden wird; diese Eigenschaft wird vererbt. Dynamische Bindung erleichtert spätere Erweiterungen: Spezialisierte Klassen können ergänzt werden, ohne die übrige Software überarbeiten zu müssen.
Einsatzbereiche
In der objektorientierten Programmierung dient dynamische Bindung dazu, die Implementierung polymorpher Methoden laufzeitabhängig auszuwählen. Die Auswahl kann beispielsweise mithilfe von Run-Time Type Information (RTTI) erfolgen; RTTI sind Typinformationen, die während der Programmausführung verfügbar sind.
Auch die kontextorientierte Programmierung (Context-Oriented Programming, COP) verwendet dynamische Bindung als allgemeinen Mechanismus. Damit kann Objektverhalten zur Laufzeit dynamisch zusammengesetzt und ausgeführt werden. COP behandelt dabei die Entwicklung kontextsensitiver Systeme auf Sprachebene und stellt Abstraktionen bereit, um Anpassungen modular zu verwalten und dynamisch zu aktivieren.
Technische Umsetzung
Wie dynamische Bindung umgesetzt wird, hängt von der Programmiersprache ab. Der Artikel nennt zwei Möglichkeiten:
- Bei einer Virtual Method Table legt der Compiler für jeden Typ mit virtuellen Methoden eine Tabelle an. Diese enthält Referenzen auf die jeweils aufzurufenden Methoden.
- Bei einem Dispatch Tree fügt der Compiler an jedem Aufruf einer dynamischen Methode eine Verzweigung ein. Sie wählt anhand des Objekttyps die richtige Methode aus.
Java-Beispiel
Das Java-Beispiel definiert die Basisklasse Saeugetier mit der Methode steckbrief(). Die abgeleiteten Klassen Gepard und Elefant überschreiben diese Methode. Eine Liste vom Typ List<Saeugetier> enthält anschließend ein Saeugetier-, ein Gepard- und ein Elefant-Objekt.
In der Schleife wird für jedes Element tier.steckbrief() aufgerufen. Obwohl die Variable tier den Typ Saeugetier hat, wird jeweils die Methode des tatsächlichen Objekttyps ausgeführt. Die Ausgabe lautet:
- Ich bin ein Säugetier.
- Ich bin ein Gepard.
- Ich bin ein Elefant.