Создание клонируемых объектов (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() скопирует ссылки на соответствующие объекты (т.е. выполнит поверхностное копирование). Чтобы обеспечить поддержку полного копирования объектов, вы должны в процессе клонирования создать новый экземпляр для каждой переменной ссылочного типа. Соответствующий пример мы сейчас рассмотрим.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
2 Создание и редактирование объектов
2 Создание и редактирование объектов В некотором смысле, меши - наиболее важный тип объектов в 3D-приложении. Они лежат в основе большинства видимых объектов и являются сырьём, которое может быть оснащено (rigged) и анимировано в дальнейшем. В этой главе речь идет о создании
Создание подобных объектов
Создание подобных объектов Команда OFFSET осуществляет создание подобных объектов (эквидистант) с заданным смещением. Она вызывается из падающего меню Modify ? Offset или щелчком на пиктограмме Offset на панели инструментов Modify.Можно строить подобные отрезки, дуги, окружности,
Создание объектов сцены
Создание объектов сцены В данном разделе будут рассмотрены основы создания объектов. Речь пойдет о простых объектах, однако применяемые для них правила такие же, как и для большинства сложных объектов. Кроме того, примитивы часто используются в качестве «строительных
Создание составных объектов
Создание составных объектов Составные объекты (Compound Objects) в 3ds Max 2008 представлены отдельной группой категории Geometry (Геометрия) вкладки Create (Создание) командной панели. Как правило, это тела, состоящие из двух и более простых объектов, рассмотренных выше (трехмерных объектов
Создание объектов, предусматривающих финализацию
Создание объектов, предусматривающих финализацию В главе 3 говорилось о том, что главный базовый класс .NET, System.Object, определяет виртуальный метод с именем Finalize() (метод деструктора). Реализация этого метода, заданная по умолчанию, не делает ничего.// System.Objectpublic class Object
Создание сравнимых объектов (IComparable)
Создание сравнимых объектов (IComparable) Интерфейс System.IComparable определяет поведение, позволяющее сортировать объекты по заданному ключу. Вот формальное определение.// Этот интерфейс позволяет объекту указать его связь // с другими подобными объектами.public interface IComparable { int
7.1. Создание блоковых объектов
7.1. Создание блоковых объектов Постановка задачи Необходимо иметь возможность писать собственные блоковые объекты либо использовать блоковые объекты с классами из iOS
Создание подобных объектов
Создание подобных объектов Команда OFFSET осуществляет создание подобных объектов (эквидистант) с заданным смещением. Она вызывается из падающего меню Modify ? Offset или щелчком на пиктограмме Offset на панели инструментов Modify.Можно строить подобные отрезки, дуги, окружности,
2.2. Создание объектов сцены
2.2. Создание объектов сцены В данном разделе главы будут рассмотрены основы создания объектов. Речь пойдет о простых объектах, однако применяемые для них правила такие же, как и для большинства сложных объектов. Кроме того, примитивы часто используются в качестве
Создание подобных объектов
Создание подобных объектов Команда OFFSET осуществляет создание подобных объектов (эквидистант) с заданным смещением. Она вызывается из падающего меню Modify ? Offset или щелчком на пиктограмме Offset на панели инструментов Modify.Можно строить подобные отрезки, дуги, окружности,
Создание зеркальной копии объектов
Создание зеркальной копии объектов Команда MIRROR создает зеркальное (симметричное) отображение объектов относительно линии зеркальной оси (оси симметрии), определенной двумя выбранными крайними точками.После запуска команды MIRROR AutoCAD выдаст приглашение: Select objects: Выберите
Создание подобных объектов
Создание подобных объектов Команда OFFSET осуществляет создание подобных объектов (эквидистант) с заданным смещением. Она вызывается из падающего меню Modify ? Offset или щелчком на пиктограмме Offset на панели инструментов Modify.Можно строить подобные отрезки, дуги, окружности,
Создание объектов
Создание объектов Мы рассмотрели базовые операции размещения новых объектов. Простейший способ размещения записывается какcreate xи его эффект был определен триадой: создать новый объект; связать его со ссылкой x; и инициализировать его поля.Вариант этой инструкции