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.

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.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!