нужно выполнять в исходном классе, используя прием обертывания метода. Давайте обеспечим эту возможность для класса Person, создав в нем соответствующий метод: public Person StandartClone() { Person p = (Person)this.MemberwiseClone(); return(p); } Теперь клиенты класса могут легко создавать поверхностные клоны. Вот пример: public void TestStandartClone() { Person mother = new Person("Петрова Анна"); Person daughter = new Person("Петрова Ольга"); Person son = new Person("Петров Игорь"); mother[0] = daughter; mother[1] = son; Person mother_clone = mother.StandartClone(); Console.WriteLine("Дети матери: {0}",mother.Fam); Console.WriteLine (mother[0].Fam); Console.WriteLine (mother[1].Fam); Console.WriteLine("Дети клона: {0}",mother_clone.Fam); Console.WriteLine (mother_clone[0].Fam); Console.WriteLine (mother_clone[1].Fam); } При создании клона будет создана копия только одного объекта mother. Обратите внимание: при работе с полем children, задающим детей, используется индексатор класса Person, выполняющий индексацию по этому полю. Вот как выглядят результаты работы теста.
Рис. 19.5. Поверхностное клонирование Если стандартное поверхностное клонирование нас не устраивает, то класс можно объявить наследником интерфейса ICloneable и реализовать метод Clone - единственный метод этого интерфейса. В нем можно реализовать полное глубокое клонирование |