Создание клонируемых объектов (ICloneable)

Создание клонируемых объектов (ICloneable)

Вы, должно быть, помните из главы 3, что System.Object определяет член с именем MemberwiseClone(). Указанный метод используется для получения поверхностной копии объекта. Пользователи объекта не могут вызвать этот метод непосредственно (поскольку он является защищенным), но сам объект может вызвать этот метод в процессе клонирования. Для примера предположим, что у нас есть класс с именем Point (точка).

// Класс Point.

public class Point {

 // Открыты для простоты.

 public int x, у;

 public Point(int x, int y) { this.x = x; this.у = у; }

 public Point(){}

 // Переопределение Object.ToString().

 public override string ToString() { return string.Format("X = {0}; Y = {1}", x, у); }

}

С учетом того, что вы уже знаете о ссылочных типах и типах, характеризуемых значениями (см. главу 3), вы должны понимать, что в результате присваивания одной ссылочной переменной другой получаются две ссылки, указывающие на один и тот же объект в памяти. Поэтому следующее присваивание дает две ссылки на один и тот же объект Point в динамической памяти, и модификации любой из этих ссылок будут влиять на этот объект.

static void Main(string[] args) {

 // Две ссылки на один и тот же объект!

 Point p1 = new Point(50, 50);

 Point p2 = p1;

 р2.х = 0;

 Console.WriteLine(p1);

 Console.WriteLine(p2);

}

Чтобы обеспечить пользовательскому типу возможность возвращать копию этого типа вызывающей стороне, можно реализовать стандартный интерфейс ICloneable. Этот интерфейс определяет единственный метод с именем Clone().

public interface ICloneable {

 object Clone();

}

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

// Теперь Point поддерживает клонирование.

public class Point: ICloneable {

 public int x, y;

 public Point(){}

 public Point (int x, int y) { this.x = x; this.у = у; }

 // Возвращение копии данного объекта.

 public object Clone() { return new Point(this.x, this.y); }

 public override string ToString() { return String.Format("X = {0}; Y = {1}", x, у); }

}

С помощью указанного подхода можно создавать точные и независимые копии типа Point, как показано в следующем фрагменте программного кода.

static void Main (string[] args) {

 // Обратите внимание, Clone() возвращает объект общего типа.

 // Для получении производного типа используйте явное преобразование.

 Point р3 = new Point(100, 100);

 Point р4 = (Point)р3.Clone();

 // Изменение p4.х (это не изменит р3.х).

 р4.х = 0;

 // Вывод объектов.

 Console.WriteLine(р3);

 Console.WriteLine(p4);

}

Текущая реализация Point решает все поставленные задачи, но вы можете немного усовершенствовать процесс. Введу того, что тип Point не содержит переменных ссылочного типа, можно упростить реализацию метода Clone(), как показано ниже.

public object Clone() {

 // Скопировать все поля Point "почленно".

 return this.MemberwiseClone();

}

При наличии в Point членов-переменных ссылочного типа метод MemberwiseClone() скопирует ссылки на соответствующие объекты (т.е. выполнит поверхностное копирование). Чтобы обеспечить поддержку полного копирования объектов, вы должны в процессе клонирования создать новый экземпляр для каждой переменной ссылочного типа. Соответствующий пример мы сейчас рассмотрим.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Создание зеркальной копии объектов

Из книги AutoCAD 2009 автора Орлов Андрей Александрович

Создание зеркальной копии объектов Команда MIRROR создает зеркальное (симметричное) отображение объектов относительно линии зеркальной оси (оси симметрии), определенной двумя выбранными крайними точками.После запуска команды MIRROR AutoCAD выдаст приглашение: Select objects: Выберите


Создание объектов, предусматривающих финализацию

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Создание объектов, предусматривающих финализацию В главе 3 говорилось о том, что главный базовый класс .NET, System.Object, определяет виртуальный метод с именем Finalize() (метод деструктора). Реализация этого метода, заданная по умолчанию, не делает ничего.// System.Objectpublic class Object


Создание сравнимых объектов (IComparable)

Из книги 3ds Max 2008 автора Верстак Владимир Антонович

Создание сравнимых объектов (IComparable) Интерфейс System.IComparable определяет поведение, позволяющее сортировать объекты по заданному ключу. Вот формальное определение.// Этот интерфейс позволяет объекту указать его связь // с другими подобными объектами.public interface IComparable { int


Создание объектов сцены

Из книги AutoCAD 2009 для студента. Самоучитель автора Соколова Татьяна Юрьевна

Создание объектов сцены В данном разделе будут рассмотрены основы создания объектов. Речь пойдет о простых объектах, однако применяемые для них правила такие же, как и для большинства сложных объектов. Кроме того, примитивы часто используются в качестве «строительных


Создание составных объектов

Из книги AutoCAD 2009. Начали! автора Соколова Татьяна Юрьевна

Создание составных объектов Составные объекты (Compound Objects) в 3ds Max 2008 представлены отдельной группой категории Geometry (Геометрия) вкладки Create (Создание) командной панели. Как правило, это тела, состоящие из двух и более простых объектов, рассмотренных выше (трехмерных объектов


Создание подобных объектов

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Создание подобных объектов Команда OFFSET осуществляет создание подобных объектов (эквидистант) с заданным смещением. Она вызывается из падающего меню Modify ? Offset или щелчком на пиктограмме Offset на панели инструментов Modify.Можно строить подобные отрезки, дуги, окружности,


Создание подобных объектов

Из книги VBA для чайников автора Каммингс Стив

Создание подобных объектов Команда OFFSET осуществляет создание подобных объектов (эквидистант) с заданным смещением. Она вызывается из падающего меню Modify ? Offset или щелчком на пиктограмме Offset на панели инструментов Modify.Можно строить подобные отрезки, дуги, окружности,


Создание объектов

Из книги 3ds Max 2008 на 100 % автора Верстак Владимир Антонович

Создание объектов Мы рассмотрели базовые операции размещения новых объектов. Простейший способ размещения записывается какcreate xи его эффект был определен триадой: создать новый объект; связать его со ссылкой x; и инициализировать его поля.Вариант этой инструкции


2.2. Создание объектов сцены

Из книги AutoCAD 2008 для студента: популярный самоучитель автора Соколова Татьяна Юрьевна

2.2. Создание объектов сцены В данном разделе главы будут рассмотрены основы создания объектов. Речь пойдет о простых объектах, однако применяемые для них правила такие же, как и для большинства сложных объектов. Кроме того, примитивы часто используются в качестве


Создание подобных объектов

Из книги iOS. Приемы программирования автора Нахавандипур Вандад

Создание подобных объектов Команда OFFSET осуществляет создание подобных объектов (эквидистант) с заданным смещением. Она вызывается из падающего меню Modify ? Offset или щелчком на пиктограмме Offset на панели инструментов Modify.Можно строить подобные отрезки, дуги, окружности,


Создание подобных объектов

Из книги Написание скриптов для Blender 2.49 автора Anders Michel

Создание подобных объектов Команда OFFSET осуществляет создание подобных объектов (эквидистант) с заданным смещением. Она вызывается из падающего меню Modify ? Offset или щелчком на пиктограмме Offset на панели инструментов Modify.Можно строить подобные отрезки, дуги, окружности,


7.1. Создание блоковых объектов

Из книги автора

7.1. Создание блоковых объектов Постановка задачи Необходимо иметь возможность писать собственные блоковые объекты либо использовать блоковые объекты с классами из iOS


2 Создание и редактирование объектов

Из книги автора

2 Создание и редактирование объектов В некотором смысле, меши - наиболее важный тип объектов в 3D-приложении. Они лежат в основе большинства видимых объектов и являются сырьём, которое может быть оснащено (rigged) и анимировано в дальнейшем. В этой главе речь идет о создании