Ой параметр – экземпляр класса Monster.SortByИмя – это полное имя класса!!!

Array.Sort(mas, new Monster.SortByИмя());

foreach (Monster x in mas)

x.Passport();

Console.WriteLine("Сортировка по умениям");

Array.Sort(mas, new Monster.SortByУмение());

foreach (Monster x in mas)

x.Passport();

Console.ReadLine(); } }}

Клонирование объектов (интерфейс ICloneable)

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

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

Модернизируем предыдущий пример и создадим поверхностную копию экземпляра класса Monster с помощью метода MemberwiseClone() и реализации интерфейса ICloneable. Метод MemberwiseClone() можно вызывать только из методов класса, так как он объявлен в классе object как protected.

using System;

using System.Collections;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

class Monster :ICloneable

{

public Monster(int сила, int умение, string имя)

{

this.сила = сила;

this.умение = умение;

this.имя = имя;

}

public Monster ShallowClone()

{

return (Monster)this.MemberwiseClone();

}

public object Clone()

{

return new Monster(this.сила, this.умение, "Это-клон!" + this.имя);

}

public int Умение

{

get { return умение; }

set

{

if (value > 0) умение = value;

else умение = 0;

}

}

public void Passport()

{

Console.WriteLine("Монстр {0} сила = {1} умение= {2}", имя, сила, умение);

}

string имя;

int сила, умение;

}

class Program

{

static void Main(string[] args)

{ Monster Вася=new Monster (100,100,"Вася");

Monster X = Вася;

//2 способа создания клонов – метод ShallowClone() и Clone()

Monster Y = Вася.ShallowClone();

Monster Z = (Monster)Вася.Clone();

Чем отличается

Вася.Passport();

X.Passport();

Y.Passport();

Z.Passport();

Console.ReadLine(); } }}

Экземпляр X ссылается на ту же область памяти.ю что и экземпляр Вася. Следовательно, если внести изменения в один из этих объектов, это отразится на другом. Экземпляры Y и Z, созданные путем клонироания, обладают собственными копиями значений полей и независимы от исходного экземпляра.

Наши рекомендации