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.
3.5.2 expanded: Klassen mit Copy-Semantik<br />
Die scharfe Trennung zwischen einfachen Typen und Klassentypen ist zuweilen lästig, da auch einfachste Datenstrukturen<br />
wie Paare und Strings, die man gar nicht so sehr als Repräsentationen realer Objekte betrachtet,<br />
ebenfalls die dynamische Natur von Objekten und eine Referenzsemantik erhalten. Aus diesem Grunde bietet<br />
Eiffel die Möglichkeit, einzelne Größen o<strong>der</strong> ganze Klassen explizit an eine Copy-Semantik zu binden.<br />
expanded class INTPAIR<br />
feature<br />
left, right: INTEGER<br />
end -- class INTPAIR<br />
Abbildung 3.18: Klassendefinition mit expanded<br />
Abbildung 3.18 deklariert die Klasse INTPAIR als erweiterte (expanded) Grundklasse, <strong>der</strong>en Objekte direkt<br />
kopiert werden. Eine Deklaration y:INTPAIR hat dann den Effekt, daß die Größe y bei Zuweisungen nicht<br />
etwa einen Verweis auf ein Paar ganzer Zahlen erhält, son<strong>der</strong>n die beiden Zahlen selbst. Den gleichen Effekt<br />
würde man erzielen durch die Deklaration<br />
y: expanded PERSON<br />
auch, wenn PERSON gar nicht als expanded class deklariert wurde. Größen, die als expanded deklariert wurden,<br />
verhalten sich exakt so, als ob sie von einem einfachen Typ wären.<br />
Natürlich möchte man auch Werte zwischen den Versionen expanded und nicht expanded einer Klasse vergleichen<br />
bzw. zuweisen (so wie man ganze Zahlen in reelle konvertieren möchte und umgekehrt). Hierfür gelten<br />
die folgenden Regeln.<br />
a:=b Ist a nicht expanded und b expanded, dann ergibt sich <strong>der</strong>selbe Effekt wie bei a:=clone(b): es wird ein<br />
neues Objekt erzeugt mit den gleichen Komponenten wie b. a erhält einen Verweis auf dieses Objekt.<br />
Ist a expanded und b nicht expanded, dann ergibt sich ein Effekt wie bei a.copy(b): das Objekt a erhält<br />
in je<strong>der</strong> Komponente den entsprechenden Wert von b.<br />
a=b Der Vergleich kann nur durchgeführt werden wie bei equal(a,b), da es nur sinnvoll ist, die Inhalte <strong>der</strong><br />
Objekte zu vergleichen.<br />
expanded-Klassen verhalten sich also genauso wie die einfachen Typen von Eiffel. Deshalb werden die Grundtypen<br />
INTEGER, BOOLEAN, CHARACTER, REAL, und DOUBLE oft auch als Spezialfall <strong>der</strong> expanded-Klassen betrachtet<br />
(was eine einheitlichere Sicht auf Klassen gibt). Für expanded-Klassen darf maximal eine Initialisierungsprozedur<br />
(ohne Argumente!) deklariert werden, da Größen dieser Klassen beim Aufruf nicht mit einem Verweis,<br />
son<strong>der</strong>n als Objekt initialisiert werden.<br />
Der Denkweise von Eiffel nach sollen erweiterte Klassen die Ausnahme bilden und erhalten aus diesem Grunde<br />
das geson<strong>der</strong>te Schlüssselwort. Sie sind immer dann sinnvoll, wenn<br />
• Attribute eines Objektes (wie z.B. die vier Rä<strong>der</strong> eines Autos) niemals mit an<strong>der</strong>en Objekten geteilt<br />
werden dürfen,<br />
• Basisdatentypen für Algorithmen realisiert werden sollen, die auf einer Kopiersemantik beruhen, o<strong>der</strong><br />
• Kommunikation mit an<strong>der</strong>en Sprachen, die auf erweiterten Klassen beruhen, stattfinden soll.<br />
Der Normalfall in Eiffel aber sind die Klassen mit dynamischen Objekten.