Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 178
- Предыдущая
- 178/642
- Следующая
Интерфейс ICloneable
Вспомните из главы 6, что в классе
System.Object
MemberwiseClone()
MemberwiseClone()
CloneablePoint
Point
using System;
namespace CloneablePoint
{
// Класс по имени Point.
public class Point
{
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}";
}
}
Учитывая имеющиеся у вас знания о ссылочных типах и типах значений (см.главу 4), должно быть понятно, что если вы присвоите одну переменную ссылочного типа другой такой переменной, то получите две ссылки, которые указывают на тот же самый объект в памяти. Таким образом, следующая операция присваивания в результате дает две ссылки на один и тот же объект
Point
Console.WriteLine("***** Fun with Object Cloning *****\n");
// Две ссылки на один и тот же объект!
Point p1 = new Point(50, 50);
Point p2 = p1;
p2.X = 0;
Console.WriteLine(p1);
Console.WriteLine(p2);
Console.ReadLine();
Чтобы предоставить специальному типу возможность возвращения вызывающему коду идентичную копию самого себя, можно реализовать стандартный интерфейс
ICloneable
ICloneable
Clone()
public interface ICloneable
{
object Clone();
}
Очевидно, что реализация метода
Clone()
Point
// Теперь 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
- Предыдущая
- 178/642
- Следующая