Laden...

Wie erstellt man eine unabhängige Kopie eines Objekts einer fremden Klasse?

Erstellt von digi333 vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.204 Views
D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 13 Jahren
Wie erstellt man eine unabhängige Kopie eines Objekts einer fremden Klasse?

Wie erstellt man von einer Instanz eine unabhängige Kopie die nicht vom Original referenziert wird?


class Punkt
{
  int x;
  int y;
}


// Klasse wird verwendet in Methode
void doIt(Punkt p1)
{
   Punkt p2 = p1;
   // folgende Zeile würde auch p1 verändern
   p2.x = 0;
}


Was kann ich machen damit p1.x jetzt nicht zu Null wird? (Gibt es ein const ref wie in C?)

446 Beiträge seit 2004
vor 13 Jahren

Hallo,

für das Speichern von x und y kannst du statt einer class ein struct verwenden. Struct ist ein WerteTyp. Class ist ein Referenztyp.

Achja du könntest auch Point verwenden. Dann hast du schon eine fertige Klasse.

Referenztypen und Wertetypen werden in der Speicherung unterschiedlich gehandhabt.

Siehe dazu auch:
Value Types (C# Reference)

class (C#-Referenz)

ICloneable-Schnittstelle
Unterstützt das Klonen, wobei eine neue Instanz einer Klasse mit denselben Werten wie eine vorhandene Instanz erstellt wird.

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 13 Jahren

Das war nur ein Beispiel mit Punkt. Die Klasse hätte auch Mond oder Stern heißen können.

Der Hinweis mit dem Struct war mir bekannt, jedoch war das nicht die Frage. Es kann ja eine Klasse aus einer fremden DLL sein.

U
1.688 Beiträge seit 2007
vor 13 Jahren

Hallo,

bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 13 Jahren

Auch danke für diesen Hinweis... Ich weiß, dass class ein Referenztyp ist und ich weiß auch, dass es das Galileobuch dazu gibt. Danke also nochmal für diese Hinweise.

Was macht ihr wenn ihr eine kompilierte DLL bekommt. In dieser DLL ist eine Klasse die ihr zwei mal braucht. Einmal als Original und ein mal als eine Arbeitskopie die ihr verändert wollt.

Da sie kompiliert ist konnt ihr als auch nicht eine Methode Copy() hinzufügen. Was macht ihr um dieses Problem zu lösen?

E
118 Beiträge seit 2007
vor 13 Jahren

Hallo Digi,

in einem unserer alten Projekte wurde es so gelöst, dass eine Clone() Methode implementiert wurde, die ein übergebenes Objekt Property für Property kopiert und eine komplett neue Instanz zurück liefert.

Vielleicht ist das ja ein Ansatz.

Gruß,
Edward

S
72 Beiträge seit 2009
vor 13 Jahren

Hallo digi333,

ist es möglich das du einfach eine 2te Instanz der Klasse erstellst?

Ansonsten müsstest du mal nach Deep Copy googlen. Vielleicht gibts da ein Tool oder so, das solche arbeiten erledigen kann.

Gruß
Stefan O.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo digi333,

Einmal als Original und ein mal als eine Arbeitskopie die ihr verändert wollt.

falscher Ansatz. Warum steht in Kopie ohne ICloneable.

Lösung: Memento-Pattern.

herbivore

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 13 Jahren

Edward: Bei einer DLL sind die Property Objekte meistens nicht öffentlich.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo digi333,

die Properties sind sowieso nicht das, was man sichern sollte, sondern die Felder/Fields. Zu diesem Unterschied siehe: Untersch. Behandlung der Objektdaten bzgl. Modifizierer bei Serialisierung in den versch. Formaten. Per Reflection kommt man aber ohnehin an alles.

herbivore

D
digi333 Themenstarter:in
290 Beiträge seit 2006
vor 13 Jahren

@herbivore: Schau ich mir mal an.

@stefan O.: Das Deep Copy setzt voraus, dass das Objekt serialisierbar ist. Dann kann man mit MemoryStream und BinaryFormater eine zweie Kopie erstellen. Ich kann aber nicht immer davon ausgehen, dass eine fremde DLL das liefert.

R
103 Beiträge seit 2009
vor 13 Jahren

Wie schon von Herbivore gesagt, kommt Du über reflection auch an die geschützten Properties heran.

Allerdings ist Dein Beispiel richtig übler Programmierstil. Objecte, die von einer fremden Bibliothek herausgereicht werden sollte man IMMER auch von der Bibliothek behandelt lassen.
Das ist in C oder C++ auch nicht anders oder sogar noch "schlimmer" als in C# (z.B. unterschiedliche malloc() und free() Implementierungen in verschiedenen Dlls).