C# Language
ICloneable
Sök…
Syntax
- objekt ICloneable.Clone () {return Clone (); } // Privat implementering av gränssnittsmetod som använder vår anpassade offentliga Clone () -funktion.
- public Foo Clone () {return new Foo (this); } // Offentlig klonmetod bör använda kopikonstruktörens logik.
Anmärkningar
CLR
kräver ett metoddefinitionsobjekt object Clone()
som inte är typsäkert. Det är vanligt att åsidosätta detta beteende och definiera en typsäker metod som returnerar en kopia av den innehållande klassen.
Det är upp till upphovsmannen att bestämma om kloning endast innebär en grund kopia eller en djup kopia. För immutable strukturer som innehåller referenser rekommenderas att du gör en djup kopia. För klasser som referenser själva är det antagligen bra att genomföra en ytlig kopia.
OBS: I C#
en gränssnittsmetod implementeras privat med syntaxen som visas ovan.
Implementera ICloneable i en klass
Implementera ICloneable
i en klass med en vridning. Exponera en säker typ av Clone()
och implementera 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
}
Senare att användas på följande sätt:
{
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);
}
Observera att ändring av bob
åldern inte förändrar bob_clone
. Detta beror på att designen använder kloning istället för att tilldela (referens) variabler.
Implementera ICloneable i en struktur
Implementering av ICloneable för en struktur behövs i allmänhet inte eftersom strukturer gör en kopia av medlemsvisningen med uppdragsoperatören =
. Men designen kan kräva implementering av ett annat gränssnitt som ärver från ICloneable
.
Ett annat skäl skulle vara om strukturen innehåller en referenstyp (eller en matris) som också behöver kopieras.
// 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
}
Senare att användas på följande sätt:
static void Main(string[] args)
{
Person bob=new Person("Bob", 25);
Person bob_clone=bob.Clone();
Debug.Assert(bob_clone.Name==bob.Name);
}