Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Prinzipiell wäre es sogar möglich, daß eine Klasse K dieselbe Elternklasse mehrfach in ihrer Erbklausel<br />
auflistet, um ggf. ein feature unter mehreren Namen anzubieten. Da man diese Konstellation nicht prinzipiell<br />
ausschließen kann, muß sie sehr sauber geregelt werden.<br />
Man könnte nun verlangen, daß alle wie<strong>der</strong>holt auftretenden features durch Umbenennung getrennt werden<br />
müssen, aber das Beispiel <strong>der</strong> Hilfskräfte zeigt, daß dies nicht gerade sinnvoll ist. Die doppelt von PERSON<br />
geerbten features sind ja in Wirklichkeit absolut identisch, da sie we<strong>der</strong> umbenannt noch redefiniert wurden.<br />
Deshalb möchte man sie ohne Komplikationen wie<strong>der</strong> als einfach vorkommende features benutzen können.<br />
Entwurfsprinzip 3.8.12 (Regel des wie<strong>der</strong>holten Erbens)<br />
Bei wie<strong>der</strong>holtem Erben wird jedes feature des gemeinsamen Vorfahren als gemeinsam genutzt (shared)<br />
angesehen, wenn es auf dem gesamten Vererbungspfad nicht umbenannt wurde. Features, die auf mindestens<br />
einem Wege umbenannt wurden, werden als vervielfältigt (replicated) angesehen.<br />
Die Regel besagt also, daß alleine <strong>der</strong> Name eines wie<strong>der</strong>holt ererbten features festlegt, wie oft es in einem<br />
Erben vorkommen muß. Normalerweise erzeugt ein wie<strong>der</strong>holt geerbtes feature keine Kollision, son<strong>der</strong>n wird<br />
wie<strong>der</strong> zu einem einzelnen feature vereinigt.<br />
Jede Umbenennung eines features auf dem Vererbungpfad von <strong>der</strong> erstmalig deklarierenden Ahnenklasse zum<br />
Erben erzeugt jedoch eine weitere Kopie dieses Merkmals. Hierfür gibt es durchaus eine Reihe von Anwendungen.<br />
So könnten zum Beispiel STUDENT und UNI-ANGESTELLTE von <strong>der</strong> Klasse PERSON ein weiteres<br />
feature adresse geerbt haben – im ersten Fall als Wohnadresse, im zweiten als Adresse des Arbeitsplatzes.<br />
In HILFSKRAFT kommen nun beide Versionen vor, so daß dieses feature beim Erben umbenannt werden sollte<br />
und somit vervielfältigt wird. Die Umbenennung kann in <strong>der</strong> Klasse HILFSKRAFT stattfinden, aber sinnvoller<br />
wäre es, dies bereits vorher zu tun.<br />
Die Regel des wie<strong>der</strong>holten Erbens gilt gleichermaßen für Routinen und Attribute. Nicht erlaubt ist daher, daß<br />
eine gemeinsam genutzte Routine (in <strong>der</strong> definierenden Klasse) Verweise auf Attribute o<strong>der</strong> Routinen enthält,<br />
die auf dem Vererbungspfad umbenannt wurden. Wegen <strong>der</strong> Vervielfältigung wären diese in <strong>der</strong> Erbenklasse<br />
nicht mehr eindeutig zu identifizieren. Derartige Routinen müssen auf dem Vererbungsweg ebenfalls an<br />
passen<strong>der</strong> Stelle umbenannt werden. (Tut man dies zu spät, so muß man sogar umbenennen und redefinieren!)<br />
So, wie sie bisher formuliert wurde, hinterläßt die Regel des wie<strong>der</strong>holten Erbens noch ungeklärte Probleme bei<br />
features, die an formale generische Parameter gebunden sind. In <strong>der</strong> folgenden Situation, die in komplexerer<br />
Form auch bei indirektem wie<strong>der</strong>holten Erben auftreten kann, wird ein feature f auf dem Vererbungsweg<br />
nicht umbenannt, erhält aber beim Erben verschiedene Typen.<br />
class GENERISCH[X] feature<br />
f:X; ....<br />
end -- GENERISCH<br />
class ERBE inherit<br />
GENERISCH[INTEGER]; GENERISCH[PERSON]<br />
.<br />
end -- ERBE<br />
Bei einer gemeinsamen Nutzung von f wäre unklar, ob f vom Typ INTEGER o<strong>der</strong> vom Typ PERSON ist. Ähnliche<br />
Mehrdeutigkeiten träten auf, wenn f als eine Routine mit einem formalen Argument vom Typ X deklariert<br />
worden wäre. Diese Mehrdeutigkeit wird durch die folgende Regel eliminiert.<br />
Entwurfsprinzip 3.8.13 (Regel <strong>der</strong> Generizität bei wie<strong>der</strong>holtem Erben)<br />
Der Typ eines beim wie<strong>der</strong>holten Erben gemeinsam genutzten features darf in <strong>der</strong> Elternklasse kein<br />
generischer Parameter sein. Ebenso darf eine gemeinsam genutzte Routine in <strong>der</strong> Elternklasse keine<br />
formalen Argumente enthalten, <strong>der</strong>en Typ ein generischer Parameter ist.