// Теперь Point поддерживает способность клонирования.
public class Point : ICloneable
{
public int X { get; set; }
public int Y { get; set; }
public Point(int xPos, int yPos) { X = xPos; Y = yPos; }
public Point { }
// Переопределить Object.ToString.
public override string ToString => $"X = {X}; Y = {Y}";
// Возвратить копию текущего объекта.
public object Clone => new Point(this.X, this.Y);
}
Теперь можно создавать точные автономные копии объектов типа Point
Console.WriteLine("***** Fun with Object Cloning *****\n");
...
// Обратите внимание, что Clone возвращает простой тип object
.// Для получения производного типа требуется явное приведение
Point p3 = new Point(100, 100);
Point p4 = (Point)p3.Clone;
// Изменить р4.Х (что не приводит к изменению р3.Х).
p4.X = 0;
// Вывести все объекты.
Console.WriteLine(p3);
Console.WriteLine(p4);
Console.ReadLine;
Несмотря на то что текущая реализация типа Point
Point не содержит никаких внутренних переменных ссылочного типа, реализацию метода Clone можно упростить:// Копировать все поля Point по очереди.
public object Clone => this.MemberwiseClone;
Тем не менее, учтите, что если бы в типе Point
MemberwiseClone копировал бы ссылки на эти объекты (т.е. создавал бы Более сложный пример клонирования
Теперь предположим, что класс Point
PointDescription. Данный класс представляет дружественное имя точки, а также ее идентификационный номер, выраженный как System.Guid (глобально уникальный идентификатор (globally unique identifier — GUID), т.е. статистически уникальное 128-битное число). Вот как выглядит реализация:using System;
namespace CloneablePoint
{
// Этот класс описывает точку.
public class PointDescription
{
public string PetName {get; set;}
public Guid PointID {get; set;}
public PointDescription
{
PetName = "No-name";
PointID = Guid.NewGuid;
}
}
}
Начальные изменения самого класса Point
ToString для учета новых данных состояния, а также определение и создание ссылочного типа PointDescription. Чтобы позволить внешнему миру устанавливать дружественное имя для Point, необходимо также изменить аргументы, передаваемые перегруженному конструктору:public class Point : ICloneable
{
public int X { get; set; }
public int Y { get; set; }
public PointDescription desc = new PointDescription;
public Point(int xPos, int yPos, string petName)
{
X = xPos; Y = yPos;
desc.PetName = petName;
}
public Point(int xPos, int yPos)
{
X = xPos; Y = yPos;
}
public Point { }
// Переопределить Object.ToString.
public override string ToString
=> $"X = {X}; Y = {Y}; Name = {desc.PetName};\nID = {desc.PointID}\n";
// Возвратить копию текущего объекта.
public object Clone => this.MemberwiseClone;
}
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT