22.08.2013 Aufrufe

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

MEHR ANZEIGEN
WENIGER ANZEIGEN

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.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!