22.08.2013 Aufrufe

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

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.

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.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!