Duck Typing
aus Wikipedia, der freien Enzyklopädie
Duck Typing ist eine Form von dynamischer Typisierung in Programmiersprachen.
Der Begriff „Duck Typing“ wurde Anfang August 2003 von Dave Thomas in der Ruby-Community geprägt. Er geht auf James Whitcomb Rileys Gedicht
„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.“
zurück, was übersetzt bedeutet: „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.“
Dieser Ausspruch verdeutlicht gut den hinter dieser Technik stehenden Gedanken. Wird eine Variable mit einem Wert belegt, beispielsweise mit einer Gleitkommazahl, dann ist der Datentyp der Variable selbst auch eine Gleitkommazahl und beispielsweise kein String. Es wird vom Compiler anhand der zugewiesenen Werte ermittelt, welchen Datentyp die Variable besitzt.
[Bearbeiten] Beispiel für die Programmiersprache Ruby
class Duck def sound puts 'Quak' end end class Cat def sound puts 'Miau' end end duck = Duck.new duck.sound duck = Cat.new duck.sound
Ausgabe:
Quak Miau
[Bearbeiten] Beispiel für die Programmiersprache Boo
Beispiel von der Projektseite ([1]), Stand 19. April 2006, 19.52 Uhr
d as duck d = 5 // currently set to an integer. print d d += 10 // It can do everything an integer does. print d d = "Hi there" // sets it to a string. print d d = d.ToUpper() // It can do everything a string does. print d
Ausgabe:
5 15 Hi there HI THERE
[Bearbeiten] Erläuterung des Beispiels
Es wird die Variable d angelegt und ihr wird der Datentyp duck zugewiesen. Dies ist kein richtiger Datentyp, sondern nur eine Art Container, der andere Datentypen annehmen kann. In der zweiten Zeile wird d der Integerwert 5 zugewiesen.
In Zeile 6 wird ihr die Zeichenkette Hi there zugewiesen. In anderen Programmiersprachen wie beispielsweise C# oder C++, würde dies jetzt zu einem Compiler-Fehler führen.
Der Boo-Compiler hingegen erkennt am Datentyp duck, dass sich der Datentyp der Variable d ändern kann.