Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
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)