Werte aus einem Objekt in ein anderes

Eroli

Erfahrenes Mitglied
Hallo zusammen,

ich habe folgende Klasse definiert:

C#:
namespace MoTD
{
    partial class GameControl
    {
        public class Waypoint
        {
            private int m_X;
            private int m_Y;
            private bool m_Vertical;
            private int m_Changer = 1;

            public int X
            {
                get
                {
                    return m_X;
                }
                set
                {
                    m_X = value;
                }
            }
            public int Y
            {
                get
                {
                    return m_Y;
                }
                set
                {
                    m_Y = value;
                }
            }
            public bool Vertical
            {
                get
                {
                    return m_Vertical;
                }
                set
                {
                    m_Vertical = value;
                }
            }
            public int Changer
            {
                get
                {
                    return m_Changer;
                }
                set
                {
                    m_Changer = value;
                }
            }
        }
    }
}

Nun erstelle ich ein Objekt davon:

C#:
Waypoint m_Waypoint = new Waypoint();
m_Waypoint.X = 128;
m_Waypoint.Y = 130;
m_Waypoint.Vertical = true;
m_Waypoint.Changer = 1;

Das will ich jetzt in ein anderes Objekt, auch von der Klasse Waypoint, übertragen:
C#:
Waypoint PossibleWaypoints = new Waypoint();
                        PossibleWaypointsY.X = m_Waypoints.X;
                        PossibleWaypointsY.Y = m_Waypoints.Y;
                        PossibleWaypointsY.Vertical = m_Waypoints.Vertical;
                        PossibleWaypointsY.Changer = m_Waypoints.Changer;
Dieser Code klappt dabei genau so wenig wer der nachfolgende:
C#:
Waypoint PossibleWaypoints = new Waypoint();
PossibleWaypoints = m_Waypoints;

Die Werte die am Anfang in m_Waypoint geschrieben wurden sind noch da, laut Debugger, nur Sie werden einfach nicht in PossibleWaypoints geschrieben. Warum nicht?


Viele Grüße und ich hoffe ihr habt verstanden wie ich das meine,

Eroli
 
Weil dadurch auf den ersten Blick nicht ersichtlich ist, dass das Objekt kopiert wird. Es könnte was weiß ich damit anstellen (zu Vergleichszwecken etc.)

Durch die Implementierung des IClonable-Interfaces erhält das Objekt eine Methode Clone, welche zum Kopieren verwendet wird. Dadurch ist dies auf den ersten Blick für den Entwickler ersichtlich.

Weitere Möglichkeit: MemberwiseClone.
 
Hallo Norbert,
danke, daran hab ich jetzt nicht irgendwie nicht gedacht, das ist natürlich die schönere Variante. Nun kennt Eroli halt zwei Methoden wie er das bewerkstelligen kann ;)

Gruß
Konstantin
 
Hallo und danke erstmal für die Antworten.

Das mit dem Kopierinterface habe ich verstanden, das mit dem ICloneable hingegen nicht.
Kann mir das vielleicht einer erklären?

EDIT: Und waurm klappt mein Weg eigentlich nicht?
 
Warum hat es nicht funktioniert?

Bei diesem Code
C#:
#
Waypoint PossibleWaypoints = new Waypoint();
PossibleWaypointsY.X = m_Waypoints.X;
PossibleWaypointsY.Y = m_Waypoints.Y;
PossibleWaypointsY.Vertical = m_Waypoints.Vertical;
PossibleWaypointsY.Changer = m_Waypoints.Changer
definierst du PossibleWaypoints, schreibst die Daten aber in ein Objekt namens PossibleWaypointsY. Kann also nicht funktionieren.

Bei der Variante
C#:
Waypoint PossibleWaypoints = new Waypoint();
PossibleWaypoints = m_Waypoints;
kopierst du nur die Referenz. Nicht aber das Objekt selbst.

Wie funktioniert ICloneable?

Hier eine Beispiel-Klasse, welche das ICloneable-Interface implementiert:
C#:
public class Driver : ICloneable
{
    private string _firstname = null;
    private string _lastname = null;

    public string Firstname
    {
        get { return this._firstname; }
        set { this._firstname = value; }
    }

    public string Lastname
    {
        get { return this._lastname; }
        set { this._lastname = value; }
    }

    #region ICloneable Members

    public object Clone()
    {
        Driver d = new Driver();
        d.Firstname = this._firstname;
        d.Lastname = this._lastname;
        return d;
    }

    #endregion
}

So, und jetzt der Test:

C#:
Driver d = new Driver();
d.Firstname = "Norbert";
d.Lastname = "Eder";

Driver d2 = (Driver)d.Clone();

Debug.WriteLine(d.GetHashCode());
Debug.WriteLine(d2.GetHashCode());
Hier ist auf den ersten Blick ersichtlich, dass es sich um eine Kopie handelt (durch das Clone. Weiters kannst du durch die Ausgabe der Hashcodes sehen, dass es sich um unterschiedliche Objekte handelt.
 
Weil dadurch auf den ersten Blick nicht ersichtlich ist, dass das Objekt kopiert wird. Es könnte was weiß ich damit anstellen (zu Vergleichszwecken etc.)
.
Also ich bin schon der Meinung, dass bei einem Copy-Konstruktor auf dem ersten Blick erkenntlich ist, was er macht. Er trägt ja nicht für umsonst den Namen ;)

Die Vergleiche oder was auch immer kann ich auch genauso in der Clone-Methode duchführen.
 

Neue Beiträge

Zurück