Основы программирования на C#


Клонирование и интерфейс ICloneable - часть 2


При создании клона будет создана копия только одного объекта mother. Обратите внимание: при работе с полем children, задающим детей, используется индексатор класса Person, выполняющий индексацию по этому полю. Вот как выглядят результаты работы теста.

Поверхностное клонирование

Рис. 19.5.  Поверхностное клонирование

Если стандартное поверхностное клонирование нас не устраивает, то класс можно объявить наследником интерфейса ICloneable и реализовать метод Clone - единственный метод этого интерфейса. В нем можно реализовать полное глубокое клонирование или подходящую для данного случая модификацию.

Давайте расширим наш класс, придав ему родительский интерфейс ICloneable. Реализация метода Clone будет отличаться от стандартной реализации тем, что к имени объекта - полю Fam - будет приписываться слово "clone". Вот как выглядит этот метод:

public object Clone() { Person p = new Person(this.fam + "_clone"); //копирование полей p.age = this.age; p.children = this.children; p.count_children = this.count_children; p.health = this.health; p.salary = this.salary; p.status = this.status; return (p); }

Эта реализация является слегка модифицированной версией стандартного поверхностного клонирования. Я добавил несколько строчек в тестирующую процедуру для проверки работы этой версии клона:

Person mother_clone2 = (Person)mother.Clone(); Console.WriteLine("Дети клона_2: {0}",mother_clone2.Fam); Console.WriteLine (mother_clone2[0].Fam); Console.WriteLine (mother_clone2[1].Fam);

Все работает должным образом.




Начало  Назад  Вперед