30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

9.4 Weitere wichtige technische Aspekte 245<br />

Nun ist es aber so, dass der übergebene Parameter event vom Typ Event<br />

ist. Dort s<strong>in</strong>d also die speziellen Methoden der davon abgeleiteten Klassen<br />

KeyEvent und MouseEvent noch nicht bekannt, denn diese werden ja erst<br />

<strong>in</strong> den abgeleiteten Klassen deklariert. Also können sie direkt auf event<br />

natürlich auch nicht aufgerufen werden. Der Compiler würde ja z.B. bei<br />

e<strong>in</strong>em Aufruf<br />

event.getKey();<br />

gar nicht sehr freundlich reagieren und anmerken, dass man sich gefälligst e<strong>in</strong>mal<br />

die Deklaration der Klasse Event ansehen soll und nur D<strong>in</strong>ge verwenden<br />

soll, die tatsächlich dort deklariert s<strong>in</strong>d.<br />

Jedoch ist aufgrund des Event-Typs, der <strong>in</strong> Zeile 135 abgefragt wird, sehr<br />

wohl bekannt, dass es sich z.B. wirklich um e<strong>in</strong>en KeyEvent handelt, auch<br />

wenn dieser nur als Reference auf e<strong>in</strong>en Event übergeben wurde. Also überzeugt<br />

man den Compiler, dass man schon weiß, was man tut und setzt e<strong>in</strong>en<br />

expliziten Downcast auf KeyEvent e<strong>in</strong>, wie <strong>in</strong> den Zeilen 139–140 zu sehen ist.<br />

Und genau hier sehen wir zum ersten Mal die wahre Natur von dynamic_cast:<br />

Bei e<strong>in</strong>em dynamic_cast wird zur Laufzeit e<strong>in</strong>e Überprüfung vorgenommen,<br />

ob diese Umwandlung überhaupt zulässig ist. Wenn ja, dann<br />

wird die Umwandlung durchgeführt, wenn ne<strong>in</strong>, dann endet das Programm<br />

<strong>in</strong> e<strong>in</strong>em Fehler – nun ja, muss nicht se<strong>in</strong>, wenn man weiß, wie man das Ende<br />

des Programms verh<strong>in</strong>dert. In Wahrheit wird e<strong>in</strong>e Exception geworfen und<br />

zwar e<strong>in</strong>e bad_cast Exception. Wie man mit solchen Exceptions umgeht, ist<br />

Thema von Kapitel 11. Was es ganz genau mit dieser besonderen Exception<br />

auf sich hat, wird <strong>in</strong> Abschnitt 15.6 noch näher besprochen. Zurück zum<br />

Thema: Nach e<strong>in</strong>em zulässigen dynamic_cast, der nicht <strong>in</strong> e<strong>in</strong>er Exception<br />

endet, haben wir also sichergestellt, dass wir es tatsächlich mit e<strong>in</strong>em Objekt<br />

vom Typ KeyEvent zu tun haben und können damit auch getKey darauf<br />

aufrufen.<br />

Zu Beg<strong>in</strong>n der Diskussion über Downcasts habe ich schon erwähnt, dass<br />

man wirklich genau wissen muss, was man tut. Leider gibt es nicht allzu<br />

wenige Entwickler, bei denen dieses Wissen eher rudimentär vorhanden ist,<br />

die aber trotzdem Datentypen mittels Downcasts munter durch die Gegend<br />

wandeln und so die schönsten Zeitbomben <strong>in</strong> ihre Software e<strong>in</strong>bauen. In<br />

altbekannter Manier möchte ich daher die häufigsten Fehlerquellen <strong>in</strong> der<br />

Folge aufzeigen.<br />

Vorsicht Falle: Downcasts sollten pr<strong>in</strong>zipiell nur dann verwendet werden,<br />

wenn sie unbed<strong>in</strong>gt notwendig s<strong>in</strong>d. Oft passiert es, dass bereits e<strong>in</strong> Fehldesign<br />

vorliegt, das auf die Schnelle durch e<strong>in</strong>en Downcast versteckt werden<br />

kann (z.B. unnötig falscher Parameter <strong>in</strong> Methodenaufruf, etc.). Weil aber<br />

Downcasts pr<strong>in</strong>zipiell e<strong>in</strong>e Gefahr darstellen, sollte man darüber nachdenken,<br />

ob man vielleicht auch e<strong>in</strong>e saubere Lösung ohne Downcasts f<strong>in</strong>den kann. Das<br />

bedeutet natürlich nicht, dass man Downcasts auf Kosten der Modularität,<br />

Erweiterbarkeit und Allgeme<strong>in</strong>heit e<strong>in</strong>es Programms vermeiden muss, aber

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!