Laden...

Variablenübergabe an Form ohne Referenz

Erstellt von interzone vor 18 Jahren Letzter Beitrag vor 18 Jahren 5.635 Views
I
interzone Themenstarter:in
95 Beiträge seit 2005
vor 18 Jahren
Variablenübergabe an Form ohne Referenz

ich übergebe in meinem programm von einer form ein objekt einer klasse über den konstruktor zu einer anderen form. anscheinend nimmt die 2te form nur eine referenz auf das objekt in der owner form und manipuliert die urspüngliche variable. wie kann ich das verhindern?

thx im vorraus

P
939 Beiträge seit 2003
vor 18 Jahren

Deswegen nennt man Klassen auch Referenztypen. Es werden nur Referenzen auf Objekte umhergereicht, keine Kopien.

Wenn du eine Kopie brauchst, kannst du z.B. das ICloneable-Interface implementieren oder du fügst deiner Klasse einen Kopier-Konstruktor hinzu. Ein Konstruktor, der ein Objekt des selben Types entgegennimmt und aus diesem die Werte entnimmt, um ein zweites Objekt zu initialisieren.

Du kannst statt einer Klasse auch eine Struktur verwenden. Das wäre dann ein Wertetyp. Wertetypen werden bei einer Zuweisung kopiert. Bei jeder Zuweisung, also wenn es eine grosse Struktur ist, bisschen darauf achten.

S
8.746 Beiträge seit 2005
vor 18 Jahren

Oder einfach die Klasse immutable machen, d.h. unveränderbar. Also nur Read-only-Felder und/oder Methoden, die geänderte Kopien des Objektes rausgeben (so macht es die Sring-Klasse).

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo interzone,

oder einfach einen ReadOnly-Wrapper für die Klasse zur Verfügung stellen (so macht es die ArrayList-Klasse).

herbivore

I
interzone Themenstarter:in
95 Beiträge seit 2005
vor 18 Jahren

ein altes problem hat mich wieder eingeholt. ich suche noch immer eine lösung für mein problem aus dem ersten post.

momentan hab ich eine clone() methode implementiert um das gewünschte objekt zu klonen vor dem bearbeiten. bevor ich das objekt zum bearbeiten schicke wird es also geklont, damit das geklonte objekt bearbeitet wird. lösche ich ein subobjekt aus diesem objekt und verwerfe die änderung in meinem programm werden die änderungen brav verworfen. ändere ich ein subobjekt aus diesem objekt wird das subobjekt auch im stammobjekt geändert...

hab schon ein paar mal clone() eingebaut, dann versucht diese subobjekte (sind arrays) mit copyto() zu kopieren - aber bringt alles nix. das einzige was funzt ist löschen verwerfen - andere änderungen werden wie gesagt nicht verworfen...

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo interzone,

was du willst, ist dass das Objekt nicht geändert werden kann. Deshalb ist kopieren ein feilen an Symptomen (Änderungen rückgängig machen). Das ist - auch wenn ich Pulpapex schätze - der falsche Weg.

Verfolge die anderen Vorschläge, also immutable oder ReadyOnly-Wrapper oder ändere die Methode ganz einfach so, dass sie das Objekt nicht ändert.

herbivore

I
interzone Themenstarter:in
95 Beiträge seit 2005
vor 18 Jahren

so ich glaube ich habs jetzt geschafft - jedoch etwas unschön. jedes meiner zu klonenden objekte hat ja mehrere subobjekte gleichen typs in einem array gespeichert. vorher hatte ich probiert das komplette array zu klonen (funzt nicht), jetzt hab ich eine for-schleife, die mir das komplette array element für element ausliest und element für element klont. ist das vllt schlechter für die performance? es werden da 2 arrays durchlaufen - sie haben 100 elemente...

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo interzone,

der Weg ist auch dann schlecht, wenn die Performance (die hier sicher ziemlich ungünstig ist) stimmen würde. Bei OOP kommt es m.E. nicht nur darauf an, sein Ziel zu erreichen, sondern das auf eine angemessene Weise zu tun. Welche Wege ich präferieren würde, habe ich ja schon gesagt.

herbivore