Ниже приведен пример программы, в которой демонстрируется применение интерфейса
ICloneable.В ней создается классTest,содержащий ссылку на объект класса X. В самом классеTestиспользуется методClone() для создания полной копии.// Продемонстрировать применение интерфейса ICloneable.
using System;
class X {
public int a;
public X(int x) { a = x; }
}
class Test : ICloneable {
public X о; public int b;
public Test (int x, int y) { о = new X(x); b = y;
}
public void Show(string name) {
Console.Write("Значения объекта " + name + ": ");
Console.WriteLine("o.a: {0}, b: {1}", o.a, b);
}
// Создать полную копию вызывающего объекта, public object Clone() {
Test temp = new Test(o.a, b); return temp;
}
}
class CloneDemo {
static void Main() {
Test obi = new Test(10, 20);
obi.Show("obi");
Console.WriteLine("Сделать объект ob2 копией объекта obi.");
Test ob2 = (Test) obi.Clone ();
ob2.Show("ob2");
Console.WriteLine("Изменить значение obi.о.а на 99, " +
" а значение obl.b — на 88.");
obi.о.a = 99; obl.b = 88;
obi.Show("obi"); ob2.Show("ob2");
}
}
, Ниже приведен результат выполнения этой программы.
Значения объекта оЫ: о.а: 10, Ь: 20 Сделать объект оЬ2 копией объекта оЫ.
Значения объекта оЬ2: о.а: 10, Ь: 20
Изменить значение obi.о.а на 99, а значение obl.b — на 88.
Значения объекта оЫ: о.а: 99, Ь: 88 Значения объекта оЬ2: о.а: 10, Ь: 20
Как следует из результата выполнения приведенной выше программы, объект
оЬ2 является копией объекта оЫ, но это совершенно разные объекты. Изменения в одном из них не оказывают никакого влияния на другой. Это достигается конструированием нового объекта типа Test, который выделяет новый объект типа X для копирования. При этом новому экземпляру объекта типа X присваивается такое же значение, как и у объекта типа X в оригинале.Для
получения неполной копии достаточно вызвать методMemberwiseClone (),определяемый в классеObjectиз методаClone (). В качестве упражнения попробуйте заменить методClone() в предыдущем примере программы на следующий его вариант.// Сделать неполную копию вызывающего объекта, public object Clone () {
Test temp = (Test) MemberwiseClone(); return temp;
}
После этого изменения результат выполнения данной программы будет выглядеть следующим образом.
Значения объекта obi: о.а: 10, Ь: 20 Сделать объект оЬ2 копией объекта оЫ.
Значения объекта оЬ2: о.а: 10, Ь: 20
Изменить значение obi.о.а на 99, а значение obl.b — на 88.
Значения объекта obi: о.а: 99, Ь: 88 Значения объекта оЬ2: о.а: 99, Ь: 20