Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Das Problem ist nun, daß beide Elternklassen, STUDENT und UNI-ANGESTELLTE das feature fachbereich benutzen.<br />
Bei Aufruf dieses features ist also nicht klar, welches <strong>der</strong> beiden gemeint sein soll. Solche Konflikte<br />
müssen in einer Programmiersprache verboten werden, da die Wahl des geerbten features ja nicht zufällig<br />
getroffen werden kann und es unwahrscheinlich ist, daß in beiden Fällen dasselbe gemeint ist. So bezeichnet<br />
zum Beispiel das feature fachbereich bei Studenten das Hauptfach, das sie studieren, und bei Universitätsangestellten<br />
den Fachbereich, an dem sie arbeiten. Daher gilt<br />
In Eiffel sind Mehrfachvererbungen mit Namenskonflikten verboten.<br />
Die Klasse HILFSKRAFT, so wie sie oben beschrieben ist, würde also vom Compiler abgelehnt werden. 32<br />
Wie kann man sich nun behelfen? Es wäre wenig sinnvoll zu verlangen, daß die Namen aller im System deklarierten<br />
Routinen verschieden sein müssen, da dies eine praktische Weiterentwicklung einer Eiffel-Bibliothek<br />
erheblich erschweren würde. Man kann die Eltern nicht dafür verantwortlich machen, daß in einer Erbenklasse<br />
Namenskonflikte auftreten. Es ist eher das Problem <strong>der</strong> Erben, welche diese Kollision durch die Wahl<br />
<strong>der</strong> Elternklassen erzeugt haben. Deshalb muß das Problem auch in <strong>der</strong> Erbenklasse gelöst werden.<br />
Die einfachste Möglichkeit hierfür ist eine Umbenennung von features, d.h. ein Mechanismus, <strong>der</strong> es ermöglicht,<br />
features unter an<strong>der</strong>en Namen anzusprechen 33 . Hierzu gibt man in <strong>der</strong> Erbklausel eine rename-Unterklausel<br />
an, welche beschreibt, unter welchen Namen geerbte features weiterbenutzt werden sollen. In unserem Beispiel<br />
würde man also das feature fachbereich <strong>der</strong> Klasse STUDENT in studienfachbereich umbenennen. Die Eiffel<br />
Syntax für Umbenennungen lautet<br />
rename<br />
feature1 as new feature1,<br />
.<br />
featuren as new featuren<br />
Man achte darauf, daß mehrere Umbenenungen durch Komma getrennt sind und nicht durch Semikolon.<br />
Umbenennung hat, wie das Beispiel in Abbildung 3.39 zeigt, auch einen Einfluß auf die features, die in den<br />
export- und redefine-Klauseln genannt werden. Allgemein gilt, daß nach einer Umbenennung nur noch <strong>der</strong><br />
neue Name bekannt ist. Daher muß die rename-Unterklausel vor allen an<strong>der</strong>en Unterklauseln einer Erbklausel<br />
genannt werden.<br />
Entwurfsprinzip 3.8.11 (Regel <strong>der</strong> Feature-Umbenennung)<br />
Features, die in einer rename-Unterklausel umbenannt wurden, können in export- und redefine-Klauseln<br />
nur unter ihrem neuen Namen angesprochen werden.<br />
Neben <strong>der</strong> Beseitigung von Namenskonflikten gibt es auch weitere sinnvolle Anwendungen für Umbenennungen.<br />
So ist oft <strong>der</strong> Name, unter denen eine Klasse ein feature erbt, für den speziellen Verwendungszweck nicht<br />
aussagekräftig genug. Die Routine gehalt hat sich bisher zum Beispiel nur auf das Bruttogehalt bezogen, für<br />
das Arbeitgeber und Finanzamt sich interessieren. Für die Familie zählt aber, was nach Steuern und Sozialabgaben<br />
übrigbleibt – das Nettogehalt. In Erbenklassen von ARBEITNEHMER kann es also durchaus ratsam<br />
sein, das feature gehalt in bruttogehalt umzubenennen.<br />
Umbenennung ist ein syntaktischer Mechanismus, <strong>der</strong> sich auf die Namensgebung für ein feature innerhalb<br />
einer Klasse und ihrer Erben auswirkt. Wichtig ist jedoch, daß Umbenennung keinen Effekt auf die Vorfahrenklassen<br />
hat. Das feature ist für Größen, <strong>der</strong>en Typ eine Ahnenklasse <strong>der</strong> umbenennenden Klasse ist, nach wie<br />
32 Diese Regel gilt nicht, wenn die Klassen, in denen die kollidierenden Namen deklariert wurden, deferred sind. In diesem<br />
Falle besteht ja keine Schwierigkeit festzustellen, welche Implementierung bei einem Aufruf des features gefragt ist – es gibt ja<br />
keine. Die Regelung für diesen Fall besagt, daß beide aufgeschobenen Routinen zu einer neuen aufgeschobenen Routine vereinigt<br />
werden, die ggf. auch dann eine effektive Version erhalten kann. Mehr zu diesem join Mechanismus und den Möglichkeiten,<br />
diesen durch rename und undefine auch auf effektive features auszudehnen, findet man in [Meyer, 1992, Kapitel 10.17/18].<br />
33 Damit ist Umbenennung komplementär zur Redefinition, die mit demselben Namen unterschiedliche Implementierungen<br />
eines features anspricht – abhängig vom Typ des Objektes. Redefinition ist also ein semantischer Mechanismus, Umbenennung<br />
ist ein rein syntaktischerMechanismus, <strong>der</strong> gewährleistet, daß dieselbe Implementierung eines features – abhängig vom Typ des<br />
Objektes – unter unterschiedlichen Namen angesprochen werden kann.