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.
Komponentenzugriff: Der direkte Zugriff auf Komponenten eines Objektes geschieht über den Namen des<br />
entsprechenden Attributs. Ist also person 1 ein bereits bekanntes Objekt vom Typ Person, dann liefert<br />
person 1.name<br />
die Zeichenkette, die unter <strong>der</strong> zu name zugehörigen Komponente gespeichert ist. Bei Attributen, <strong>der</strong>en<br />
Typ eine Klasse ist, wird natürlich <strong>der</strong> Verweis geliefert und nicht etwa das Objekt selbst.<br />
person 1.vater<br />
liefert also einen Verweis auf das Objekt, welches den Vater von person 1 darstellen soll.<br />
Auch bei <strong>der</strong> Verwendung von Komponentenzugriffen gilt die obengenannte Einschränkung des Geheimnisprinzips.<br />
Ein Komponentenzugriff gilt ebenso wie jede an<strong>der</strong>e Routine als eine Dienstleistung,<br />
die von <strong>der</strong> Klasse bereitgestellt werden muß. Ein Zugriff auf eine beliebige Komponente ist daher nur<br />
dann möglich, wenn dies bei <strong>der</strong> Klassendeklaration explizit vereinbart wurde. Näheres dazu besprechen<br />
wir im Abschnitt 3.4.<br />
Auflösen eines Verweises: Manchmal kann es nötig sein, einen Verweis von dem ihm zugeordneten Objekt<br />
wie<strong>der</strong> zu lösen. Dies geschieht durch Zuweisung des Wertes Void. Um also die Komponente autor eines<br />
gegebenen Buchobjektes wie<strong>der</strong> von ihrem Objekt zu lösen, schreibt man:<br />
autor := Void<br />
Diese Auflösung des Verweises versetzt also Verweis aus dem Zustand created zurück in den leeren Zustand.<br />
Wichtig ist aber, hierdurch ausschließlich <strong>der</strong> Zustand des Verweises verän<strong>der</strong>t wird und nicht etwa<br />
das Objekt selbst. Das Objekt, mit dem die Komponente autor verbunden war, wird nicht angerührt.<br />
Insbeson<strong>der</strong>e wird es auch nicht gelöscht, son<strong>der</strong>n bleibt ggf. über an<strong>der</strong>e Verweise noch zugreifbar.<br />
Auflösung von Verweisen darf auch nicht verwechselt werden mit Anweisungen, die Speicherplatz an das<br />
Betriebssystem zurückgeben (wie etwa dispose in Pascal). Solche Anweisungen sind sehr gefährlich, da<br />
hierdurch eventuell Objekte zerstört werden, die noch über an<strong>der</strong>e Verweise zugreifbar waren. In Eiffel<br />
(und auch z.B. in Lisp) wird die Speicherplatzverwaltung automatisch durch die Programmierumgebung<br />
durchgeführt und nicht etwa durch den Programmierer selbst.<br />
Überprüfung des Verweiszustandes: Um den Zustand eines Verweises zu überprüfen, <strong>der</strong> mit einer Komponente<br />
verbunden ist, bietet Eiffel einen einfachen Test an. Der boolesche Ausdruck<br />
autor = Void<br />
liefert den Wert true, wenn <strong>der</strong> Verweis <strong>der</strong> Komponente autor leer ist, und ansonsten den Wert false.<br />
Duplizierung von Objekten: Bei <strong>der</strong> Zuweisung von Objekten mittels := haben wir gesehen, daß nur die<br />
Verweise kopiert werden, aber das genannte Objekt nach wie vor nur einmal vorhanden ist. Dies ist im<br />
Normalfall die sinnvollste Vorgehensweise. In manchen Fällen ist es aber nötig, eine Kopie eines bereits<br />
bekannten Objektes (und nicht nur des Verweises) anzulegen, z.B. um daraus ein Objekt zu erzeugen, das<br />
fast identisch mit dem ersten ist. Hierzu ist die Funktion clone da. Ist person 1 ein bereits bekanntes<br />
Objekt vom Typ Person, dann liefert <strong>der</strong> Aufruf<br />
clone(person 1)<br />
einen Verweis auf ein neues Objekt, dessen Komponenten mit denen von person 1 identisch sind. Ein<br />
solcher Aufruf macht allerdings nur Sinn im Zusammenhang mit einer Zuweisung, da sonst dieses neue<br />
Objekt nicht erreichbar wäre. Die Zuweisung<br />
autor := clone(person 1)<br />
hat also zwei Effekte. Sie erzeugt ein neues, mit person 1 identisches Objekt und weist <strong>der</strong> Komponente<br />
autor als Wert einen Verweis auf dieses Objekt zu (eventuell bestehende Verweise werden also aufgelöst).<br />
clone und die mit !! zusammenhängenden Erzeugungsprozeduren sind die einzigen Operationen, welche<br />
Objekte erzeugen.