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.
class UNI-ANGESTELLTE<br />
inherit ARBEITNEHMER<br />
redefine<br />
gehalt<br />
export<br />
{ARBEITGEBER} name, vorname, geburtsjahr, adresse, gehaltsklasse;<br />
{FINANZAMT} all<br />
end -- feature-Anpassung von ARBEITNEHMER<br />
feature<br />
universität: STRING;<br />
fachbereich, raum, telephon: INTEGER;<br />
gehalt: REAL is -- Gehalt berechnen<br />
do Result := Gehalt nach Alter und gehaltsklasse end<br />
end -- class UNI-ANGESTELLTE<br />
Abbildung 3.32: Vererbung mit Redefinition<br />
Natürlich kann man diese nicht beliebig abän<strong>der</strong>n. Von außen betrachtet muß ein feature im wesentlichen<br />
unverän<strong>der</strong>t, d.h. auf die gleiche Art aufrufbar und verän<strong>der</strong>bar bleiben. Kurzum, die Vereinbarungen <strong>der</strong><br />
Elternklasse müssen weiterhin Gültigkeit haben – ansonsten sollte man besser ein neues feature deklarieren.<br />
Zu den Vereinbarungen, die von <strong>der</strong> Erbenklasse übernommen werden müssen, gehören insbeson<strong>der</strong>e die Anzahl<br />
<strong>der</strong> Argumente und die Typen <strong>der</strong> features. Routinen müssen Routinen bleiben und Attribute Attribute.<br />
Die einzigen erlaubten Ausnahmen sind ein Wechsel von parameterlosen Funktionen zu Attributen – weil<br />
hier <strong>der</strong> Kunde den Unterschied nicht sieht – und ein Übergang zu Typen, die zum ursprünglichen Datentyp<br />
passen (“konform sind”).<br />
Entwurfsprinzip 3.8.4 (Regel <strong>der</strong> Redefinition)<br />
Ein in einer Klasse deklariertes Attribut, Funktionsergebnis o<strong>der</strong> formales Routinenargument darf in einer<br />
Erbenklasse mit einem neuen Typ redeklariert werden, wenn <strong>der</strong> neue Typ konform zum ursprünglichen<br />
ist. Das Attribut o<strong>der</strong> die zugehörige Routine gilt als redefiniert.<br />
Der Rumpf einer Routine kann redefiniert werden, solange die obige Typeinschränkung nicht verletzt<br />
wird. Parameterlose Funktionen dürfen dabei als Attribute redefiniert werden.<br />
Redefinierte features, die nicht ursprünglich deferred (siehe Abschnitt 3.8.6) waren, müssen in einer<br />
entsprechenden redefine Klausel aufgeführt werden.<br />
Die Idee hinter dieser Regelung ist, daß eine Klasse immer eine speziellere Version eines in einer Ahnenklasse<br />
deklarierten Elementes anbieten kann. Deshalb ist auch eine Redefinition eines Attributes als parameterlose<br />
Funktion nicht erlaubt, weil hierdurch die Zuweisung von Werten an das Attribut unmöglich gemacht wird 25 .<br />
Die Redefinitionsregel verwendet den Begriff <strong>der</strong> Konformität zwischen zwei Datentypen. “B ist konform<br />
zu A” bedeutet in erster Näherung, daß B ein Nachkomme von A sein muß. Dies gilt in ähnlicher Form<br />
auch für den Fall, daß A und B generische Parameter enthalten. Alle in B vorkommenden aktuellen generischen<br />
Parameter müssen Nachkommen <strong>der</strong> entsprechenden Parameter in A sein. So kann zum Beispiel B die<br />
Klasse TWO WAY LIST[ENTLEIHER] sein und A die Klasse LINKED LIST[PERSON], denn die generische Klasse<br />
TWO WAY LIST ist Nachkomme von LINKED LIST und <strong>der</strong> aktuelle Parameter ENTLEIHER ein Nachkomme von<br />
PERSON.<br />
Die präzise Definition ist etwas komplizierter, da B auch in <strong>der</strong> Vererbungsklausel eine Klasse mit generischen<br />
Parametern nennen kann, die A als Vorfahren besitzt, das Konzept <strong>der</strong> Deklaration durch Assoziation<br />
hinzukommt, das wir erst in Abschnitt 3.8.5 besprechen werden, und Konformität transitiv ist.<br />
25 Bei einer Redefinition eines Attributes als parameterlose Funktion dürfte auch die Ahnenklasse keine Zuweisung an das<br />
Attribut mehr enthalten, da Größen dieser Klasse ja auch Objekte einer Nachkommenklasse bezeichnen können – Personengrößen<br />
dürfen zum Beispiel auch auf spezielle Personen, nämlich Entleiher zeigen. Damit würde die Redefinition aber einen Eingriff in<br />
die Elternklasse mit sich bringen, was völlig gegen den Sinn <strong>der</strong> Strukturierung eines Systems in unabhängige Klassen ist.