Duck-Typing
Duck-Typingist ein Konzept derobjektorientierten Programmierung,bei dem der Typ eines Objektes nicht durch seineKlassebeschrieben wird, sondern durch das Vorhandensein bestimmterMethodenoderAttribute.[1]
Es handelt sich gewissermaßen um die Anwendung desEntentestsin der Informatik, in Anlehnung anJames Whitcomb RileysGedicht:
“When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.”
„Wenn ich einen Vogel sehe, der wie eine Ente läuft, wie eine Ente schwimmt und wie eine Ente schnattert, dann nenne ich diesen Vogel eine Ente. “
Duck-Typing ist charakteristisch für objektorientierteSkriptsprachenwiePython,Groovy,PHPundRuby.
Beim Duck-Typing wird zurLaufzeitdes Programms geprüft, ob ein Objekt die entsprechenden Merkmale unterstützt. Dies führt wie bei allendynamischen Typsystemenzu einer erhöhten Flexibilität, reduziert aber ebenso die Möglichkeit, statisch zurÜbersetzungszeitFehler im Programm zu finden. In Sprachen wieJavaundD,sowieC#bis Version 3.0, ist es erforderlich, bei der Definition einer Klasse anzugeben, welcheInterfacesimplementiert werden sollen. Diese Sprachen erlauben es somit nicht, nach der Fertigstellung einer Klasse festzulegen, dass die Klasse zusätzlich noch ein anderes Interface implementiert (selbst wenn alle Methoden vorhanden wären, und die Objekte somit die gesamte Funktionalität bereitstellen würden).
InC++bietenFunktionstemplateseine Art Duck-Typing zurKompilierzeit.ÄltereGCC-Versionen boten daneben auch sogenannteSignaturesan. Diese lassen sich wie Interfaces deklarieren und nutzen, sie sind jedoch unabhängig von der Klassenhierarchie, sodass beispielsweise für eine Ente nicht erneut deklariert werden muss, dass sie schnattern kann, also die Signature implementiert. Dies entspricht denInterfacegenannten Strukturen inGo.
Beispiel
[Bearbeiten|Quelltext bearbeiten]Das folgende Codebeispiel in derProgrammiersprachePythonzeigt Ducktyping innerhalb einerForeach-Schleife.Es wird erst zurLaufzeitgeprüft, ob dieKlassedesObjektsbird
dieMethodenfly()
undswim()
deklariert.
# Klassendeklaration mit den Methoden fly() und swim()
classDuck:
deffly(self):
print("The duck is flying")
defswim(self):
print("The duck is swimming")
# Klassendeklaration nur mit der Methode fly()
classAlbatross:
deffly(self):
print("The albatross is flying")
# Initialisierung einer Liste mit je einer Instanz der beiden Klassen
birds=[Duck(),Albatross()]
# Foreach-Schleife mit Ducktyping
forbirdinbirds:
bird.fly()
bird.swim()
Das Programm erzeugt folgende Ausgabe:
The duck is flying The duck is swimming The albatross is flying 'Albatross' object has no attribute 'swim'
DieKlasseDuck
deklariert dieMethodenfly()
undswim()
.Diese werden zur Laufzeit aufgerufen. Die KlasseAlbatross
deklariert nur die Methodefly()
,die Methodeswim()
kann nicht aufgerufen werden. Daher wird eine Fehlermeldung ausgegeben.
Einzelnachweise
[Bearbeiten|Quelltext bearbeiten]- ↑Glossary — Python 3.11.1 documentation.In:docs. Python.org.Abgerufen am 3. Februar 2023.