Zoeken…


Syntaxis

  • object ICloneable.Clone () {return Clone (); } // Privé-implementatie van de interfacemethode die onze aangepaste openbare Clone () -functie gebruikt.
  • public Foo Clone () {return new Foo (this); } // Openbare kloonmethode moet de logica van de kopieconstructor gebruiken.

Opmerkingen

De CLR vereist een methode-definitieobject object Clone() dat niet type-veilig is. Het is gebruikelijk om dit gedrag te onderdrukken en een type veilige methode te definiëren die een kopie van de betreffende klasse retourneert.

Het is aan de auteur om te beslissen of klonen alleen een ondiepe kopie of een diepe kopie betekent. Voor onveranderlijke structuren die verwijzingen bevatten, wordt aanbevolen een diepe kopie te maken. Omdat klassen zelf referenties zijn, is het waarschijnlijk prima om een ondiepe kopie te implementeren.

OPMERKING: In C# een interfacemethode privé worden geïmplementeerd met de bovenstaande syntaxis.

ICloneable implementeren in een klas

Implementeer ICloneable in een klasse met een twist. Stel een veilige Clone() openbare type Clone() en implementeer object Clone() privé.

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
}

Later als volgt te gebruiken:

{
    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);
}

Merk op dat het veranderen van de leeftijd van bob niet de leeftijd van bob_clone . Dit komt omdat het ontwerp klonen gebruikt in plaats van het toewijzen van (referentie) variabelen.

ICloneable implementeren in een struct

De implementatie van ICloneable voor een struct is over het algemeen niet nodig omdat structs een lidkopie maken met de toewijzingsoperator = . Maar het ontwerp vereist mogelijk de implementatie van een andere interface die van ICloneable .

Een andere reden zou zijn als de struct een referentietype (of een array) bevat die ook moet worden gekopieerd.

// 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
}

Later als volgt te gebruiken:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow