Suche…


Syntax

  • object ICloneable.Clone () {return Clone (); } // Private Implementierung der Schnittstellenmethode, die unsere benutzerdefinierte öffentliche Clone () - Funktion verwendet.
  • public Foo Clone () {return new Foo (this); } // Die öffentliche Klonmethode sollte die Kopierkonstruktorlogik verwenden.

Bemerkungen

Die CLR erfordert ein Methodendefinitionsobjekt object Clone() das nicht typsicher ist. Es ist üblich, dieses Verhalten zu überschreiben und eine typsichere Methode zu definieren, die eine Kopie der enthaltenden Klasse zurückgibt.

Es ist Sache des Autors, zu entscheiden, ob Klonen nur flache oder tiefe Kopie bedeutet. Für unveränderliche Strukturen mit Referenzen wird empfohlen, eine tiefe Kopie zu erstellen. Für Klassen, die selbst Referenzen sind, ist es wahrscheinlich in Ordnung, eine flache Kopie zu implementieren.

HINWEIS: In C# eine Schnittstellenmethode mit der oben gezeigten Syntax privat implementiert werden.

ICloneable in einer Klasse implementieren

Implementiere ICloneable in einer Klasse mit einem Twist. Machen Sie ein öffentliches sicheres Clone() und implementieren Sie das object Clone() privat.

public class Person : ICloneable
{
    // Contents of class
    public string Name { get; set; }
    public int Age { get; set; }
    // Constructor
    public Person(string name, int age)
    {
        this.Name=name;
        this.Age=age;
    }
    // Copy Constructor
    public Person(Person other)
    {
        this.Name=other.Name;
        this.Age=other.Age;
    }

    #region ICloneable Members
    // Type safe Clone
    public Person Clone() { return new Person(this); }
    // ICloneable implementation
    object ICloneable.Clone()
    {
        return Clone();
    }
    #endregion
}

Später wie folgt zu verwenden:

{
    Person bob=new Person("Bob", 25);
    Person bob_clone=bob.Clone();
    Debug.Assert(bob_clone.Name==bob.Name);

    bob.Age=56;
    Debug.Assert(bob.Age!=bob.Age);
}

Beachten Sie, dass das Ändern des bob Alters das Alter von bob_clone nicht ändert. Dies liegt daran, dass das Design Klonen verwendet, anstatt (Referenz-) Variablen zuzuweisen.

ICloneable in einer Struktur implementieren

Die Implementierung von ICloneable für eine Struktur ist im Allgemeinen nicht erforderlich, da die Strukturen mit dem Zuweisungsoperator = eine mitgliederweise Kopie durchführen. Das Design erfordert jedoch möglicherweise die Implementierung einer anderen Schnittstelle, die von ICloneable .

Ein anderer Grund wäre, wenn die Struktur einen Referenztyp (oder ein Array) enthält, der ebenfalls kopiert werden muss.

// Structs are recommended to be immutable objects
[ImmutableObject(true)]
public struct Person : ICloneable
{
    // Contents of class
    public string Name { get; private set; }
    public int Age { get; private set; }
    // Constructor
    public Person(string name, int age)
    {
        this.Name=name;
        this.Age=age;
    }
    // Copy Constructor
    public Person(Person other)
    {
        // The assignment operator copies all members
        this=other;
    }

    #region ICloneable Members
    // Type safe Clone
    public Person Clone() { return new Person(this); }
    // ICloneable implementation
    object ICloneable.Clone()
    {
        return Clone();
    }
    #endregion
}

Später wie folgt zu verwenden:

static void Main(string[] args)
{
    Person bob=new Person("Bob", 25);
    Person bob_clone=bob.Clone();
    Debug.Assert(bob_clone.Name==bob.Name);
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow