tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
11
ZUGRIFFE
572
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Eroli Eroli ist offline Mitglied Gold
    Registriert seit
    Mar 2007
    Beiträge
    224
    Hallo zusammen,

    ich habe folgende Klasse definiert:

    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    
    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:

    Code csharp:
    1
    2
    3
    4
    5
    
    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:
    Code csharp:
    1
    2
    3
    4
    5
    
    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:
    Code csharp:
    1
    2
    
    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
     

  2. #2
    Avatar von Konstantin Gross
    Konstantin Gross Konstantin Gross ist offline Mitglied Platin
    Registriert seit
    Sep 2003
    Ort
    nähe Kassel (Hessen)
    Beiträge
    703
    Hallo,
    vielleicht ist dir ja der folgende Link hilfreich http://msdn2.microsoft.com/de-de/lib...16(VS.80).aspx.

    Gruß
    Konstantin
     
    Internetseite:
    http://www.texturenland.de

    Blog:
    http://blog.texturenland.de

    Codesnippets:
    .NET-Snippets

    - Sollte ich bei einer Frage weitergeholfen haben, würde ich mich über eine positive Bewertung freuen -

  3. #3
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Keine schöne Lösung. Implementiere das ICloneable-Interface.
     

  4. #4
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Zitat Zitat von Norbert Eder Beitrag anzeigen
    Keine schöne Lösung. Implementiere das ICloneable-Interface.
    Hi Norbert

    Was ist an einem Copy-Konstruktor keine schöne Lösung?
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  5. #5
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    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.
     

  6. #6
    Avatar von Konstantin Gross
    Konstantin Gross Konstantin Gross ist offline Mitglied Platin
    Registriert seit
    Sep 2003
    Ort
    nähe Kassel (Hessen)
    Beiträge
    703
    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
     
    Internetseite:
    http://www.texturenland.de

    Blog:
    http://blog.texturenland.de

    Codesnippets:
    .NET-Snippets

    - Sollte ich bei einer Frage weitergeholfen haben, würde ich mich über eine positive Bewertung freuen -

  7. #7
    Eroli Eroli ist offline Mitglied Gold
    Registriert seit
    Mar 2007
    Beiträge
    224
    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?
     

  8. #8
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Warum hat es nicht funktioniert?

    Bei diesem Code
    Code csharp:
    1
    2
    3
    4
    5
    6
    
    #
    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
    Code csharp:
    1
    2
    
    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:
    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    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:

    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    
    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.
     

  9. #9
    Eroli Eroli ist offline Mitglied Gold
    Registriert seit
    Mar 2007
    Beiträge
    224
    Danke, so t es jetzt endlich.

    Weiter so, ihr seid klasse
     

  10. #10
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Zitat Zitat von Norbert Eder Beitrag anzeigen
    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.
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  11. #11
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Gehen wir davon aus, dass du diesen Aufruf das erste Mal siehst (b ist hier ein Objekt vom Typ Bimbo und mit relevanten Daten gefüllt):
    Code csharp:
    1
    2
    
    Bimbo b2 = new Bimbo(b);
    Bimbo b2 = b.Clone();
    So, und jetzt sag mir (ohne zu wissen wie der Konstruktor implementiert ist), woran du erkennen willst, dass es sich um einen Copy-Constructor handelt? Der zweite Aufruf zeigt sofort, dass eine Kopie erstellt wird.

    Und wenn du sagst, dass du im Clone genauso einen Vergleich implementieren kannst, dann ist das prinzipiell richtig, dann hast du als Entwickler der Klasse aber gewaltig danebengegriffen. Warum?

    Die Methode Clone stammt vom ICloneable-Interface und ist für Kopien (die MSDN läßt sich da nicht so besonders zum Thema Shallow bzw. Deep Copies aus) gedacht. Für Vergleiche wäre Das Interface IComarable zu verwenden, wodurch die Methode CompareTo zu implementieren wäre.
     

  12. #12
    Eroli Eroli ist offline Mitglied Gold
    Registriert seit
    Mar 2007
    Beiträge
    224
    Hallo nochmal.

    Irgendwie klappt da nochwas nicht so wie es soll.

    Code csharp:
    1
    
                        m_Creep[j].NextWaypoint = (Waypoint)m_Creep[j].PossibleWaypointsY[indexY].Clone();
    Wieso klappt der Ausdruck nicht? Braucht ihr noch mehr Infos?
    m_Creep ist ein Array einer Klasse. Diese Klasse hat eine Variable NextWaypoint auch von einer eigenen Klasse Waypoint her.

    Nun will ich den Wert aus dem PossibleWaypoints-Array beim Index IndexY in NextWaypoint schreiben. Die Clone Methode sieht so aus:
    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
                public object Clone()
                {
                    Waypoint clonedWaypoint = new Waypoint();
                    clonedWaypoint.X = this.X;
                    clonedWaypoint.Y = this.Y;
                    clonedWaypoint.Vertical = this.Vertical;
                    clonedWaypoint.Changer = this.Changer;
                    return clonedWaypoint;
                }

    Ich bin so langsam echt am verzweifeln....


    Viele Grüße,
    Eroli


    EDIT: KOmmando zurück - Ich habe nen Bug gefunden. Der Indexer ist immer um 1 zu hoch...sowas ist ja sowas von ärgerlich
    Geändert von Eroli (05.04.07 um 23:14 Uhr)
     

Ähnliche Themen

  1. Werte aus einem Objekt teilen?
    Von fUnKuCh3n im Forum PHP
    Antworten: 2
    Letzter Beitrag: 04.05.10, 14:20
  2. Werte von einem Bean an ein anderes übergeben [JSF]
    Von Bexx im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 2
    Letzter Beitrag: 13.01.10, 09:39
  3. Komplettes Bitmap von einem CBitmap-Objekt in Anderes kopieren
    Von Meisterzunge im Forum VisualStudio & MFC
    Antworten: 6
    Letzter Beitrag: 10.01.07, 17:48
  4. Antworten: 8
    Letzter Beitrag: 29.09.06, 10:53
  5. Antworten: 7
    Letzter Beitrag: 08.06.05, 14:16