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.

Bei <strong>der</strong> Erzeugung von Objekten mittels clone(person 1) ist zu berücksichtigen, daß Verweise, die im<br />

Objekt person 1 enthalten sind, als Verweise identisch kopiert werden und nicht etwa zu jedem Verweis<br />

ein weiteres Objekt kopiert wird. Man sagt auch, daß clone eine flache (shallow) Kopie erzeugt: das<br />

neue Objekt ist wirklich in allen Komponenten identisch mit person 1.<br />

In manchen Anwendungen ist es jedoch notwendig, eine komplette Kopie <strong>der</strong> gesamten Objektstruktur<br />

zu erzeugen, die an <strong>der</strong> genannten Stelle beginnt. Eine solche “tiefe” Kopie wird durch die Funktion<br />

deep clone generiert. Genau besehen erzeugt also <strong>der</strong> Aufruf<br />

deep clone(person 1)<br />

einen Verweis auf ein neues Objekt, dessen Komponenten mit einfachen Datenkomponenten mit denen<br />

von person 1 identisch sind und dessen Verweiskomponenten wie<strong>der</strong>um auf neue Objekte verweisen, die<br />

mit den entsprechenden in person 1 angesprochenen Objekten bis auf Verweise identisch sind usw.<br />

Kopieren von Objektzuständen: Neben clone, <strong>der</strong> Erzeugung neuer Objekte, gibt es eine weitere sinnvolle<br />

Möglichkeit, Objekte inhaltlich zu kopieren, nämlich bestehenden Objekten die Zustände an<strong>der</strong>er<br />

Objekte zuzuweisen. Dies geschieht mit <strong>der</strong> Prozedur (nicht Funktion!) copy. Während <strong>der</strong> Befehl<br />

autor := person 1 <strong>der</strong> Größe autor nur den in person 1 enthaltenen Verweis zuweist und autor :=<br />

clone(person 1) ein zuvor nicht vorhandenes Objekt erzeugt, wird durch<br />

autor.copy(person 1)<br />

ein bereits existierendes durch autor bezeichnetes Objekt verän<strong>der</strong>t (deshalb auch die Verwendung <strong>der</strong><br />

Punktnotation: die Operation copy arbeitet auf dem Objekt, auf das autor verweist). Dieses Objekt<br />

erhält in je<strong>der</strong> Komponente den Wert <strong>der</strong> entsprechenden Komponente des durch person 1 bezeichneten<br />

Objekts. Der in autor enthaltene Verweis wird dagegen nicht verän<strong>der</strong>t. Wichtig ist aber, daß autor<br />

keinen leeren Verweis enthalten darf.<br />

Genauso wie clone erzeugt copy eine flache Kopie von Objekten. Wird eine tiefe Kopie benötigt, so ist<br />

die Prozedur deep copy anzuwenden, wie zum Beispiel in<br />

autor.deep copy(person 1)<br />

Vergleich von Objekten: Wegen des schon öfter angesprochenen Unterschiedes zwischen einem Objekt und<br />

dem Verweis darauf gibt es zwei Möglichkeiten, Objekte zu vergleichen. Die gewöhnliche Gleichheit =<br />

stellt die Frage, ob die beiden Objekte identisch sind. Die Funktion equal testet, ob die beiden Objekte<br />

in je<strong>der</strong> Komponente dieselben Werte haben. Das hat wie<strong>der</strong> zu tun mit <strong>der</strong> Tatsache, daß Größen,<br />

welche Objekte bezeichnen, in Wirklichkeit Verweise auf diese Objekte sind. Gleichheit <strong>der</strong> Größen<br />

bedeutet, daß die Verweise gleich sind, also daß auf dasselbe Objekt verwiesen wird. Der Ausdruck<br />

autor = person 1<br />

liefert true, wenn autor und person 1 dasselbe Objekt bezeichnen, und sonst false. Das Umgekehrte,<br />

<strong>der</strong> Test auf Ungleichheit <strong>der</strong> Objekte, wird durch autor /= person 1 ausgedrückt.<br />

Die Funktion equal geht einen Schritt weiter. Statt einfach die Verweise zu vergleichen, betrachtet sie<br />

die Zustände <strong>der</strong> durch autor und person 1 bezeichneten Objekte.<br />

equal(autor,person 1)<br />

liefert true, wenn entwe<strong>der</strong> die mit autor und person 1 verbundenen Verweise beide leer sind, o<strong>der</strong><br />

wenn beide bezeichneten Objekte in je<strong>der</strong> Komponente übereinstimmen (das bedeutet aber, daß in<br />

Komponenten enthaltene Verweise wie<strong>der</strong> auf dasselbe Objekt zeigen müssen). Wenn autor = person 1<br />

gilt, dann gilt auch equal(autor,person 1) aber nicht umgekehrt.<br />

Auch equal führt einen “flachen” Vergleich durch. equal(autor,person 1) gilt nur, wenn Verweise in<br />

Komponenten <strong>der</strong> durch autor und person 1 bezeichneten Objekte jeweils auf dasselbe Objekt zeigen.<br />

Der Vergleich, ob die bezeichneten Objekte strukturell identisch sind, wird aufgerufen mit<br />

deep equal(autor,person 1)

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!