Пример использования стандартного интерфейса IComparable на примере класса Monster

Стандартные интерфейсы. Клонирование. Итераторы

Стандартные интерфейсы .NET

В библиотеке .NET определено множество стандартных интерфейсов, задающих желаемое поведение объектов. Например, интерфейс IComparable задает метод сравнения объектов по принципу больше или меньше, что позволяет выполнять их сортировку. Реализация интерфейсов IEnumerable и IEnumerator дает возможность просматривать содержимое объекта с помощью конструкции foreach, а реализация интерфейса ICloneable – клонировать объекты.

Стандартные интерфейсы поддерживаются многими стандартными классами библиотеки. Например, работа с массивами с помощью цикла foreach возможна именно потому, что тип Array реализует интерфейсы IEnumerable и IEnumerator. Можно создавать и собственные классы, поддерживающие стандартные интерфейсы, что позволит использовать объекты этих классов стандартными способами.

Сравнение объектов (интерфейс IComparable)

Интерфейс IComparable содержит всего один метод CompareTo(),возвращающий результат сравнения двух объектов – текущего и переданного ему в качеству параметра:

interface IComparable

{

int CompareTo(object obj)

}

Метод должен возвращать:

o 0, если текущий объект и параметр равны

o отрицательное число, если текущий объект меньше параметра

o положительное число, если текущий объект больше параметра

Пример использования стандартного интерфейса IComparable на примере класса Monster

namespace ConsoleApplication1

{

//создание класса, использующего интерфейс для сравнения элементов

class Monster : IComparable

{

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

{

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

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

this.имя = имя;

}

public void Passport()

{

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

}

//обязательная реализация этого метода, т.к. он находится в интерфейсе

public int CompareTo(object obj)

{

Monster temp = (Monster)obj;

if (this.сила > temp.сила) return 1;

if (this.сила < temp.сила) return -1;

return 0;

}

string имя;

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

}

 

class Program

{

static void Main(string[] args)

{

const int n = 3;

Monster[] mas = new Monster[n]; //массив монстров

//инициализация каждого монстра(элемента массива)

mas[0] = new Monster(50, 50, "Вася");

mas[1] = new Monster(100, 100, "Петя");

mas[2] = new Monster(40, 10, "Игорь");

//Только теперь сортировка массива экземпляров класса Monster стала доступной, //благодаря методу CompareTo()

Array.Sort(mas);

//вывод элементов массива монстров

foreach (Monster x in mas)

x.Passport();

Console.ReadLine(); } } }

В данной программе критерием сортировки является поле сила для каждого монстра. То есть массив сортируется по возрастанию этого поля у всех экземпляров класса Monster.

Если несколько экземпляров имеют одинаковое значение критерия сортировки, то порядок их следования не изменится.

Во многих алгоритмах требуется выполнить сортировку по различным критериям. Для этого используется интерфейс IComparer.

Сортировка объектов по различным критериям (интерфейс IComparer)

Данный интерфейс определен в пространстве имен System.Collections. Он также содержит один методCompare(),возвращающий результат сравнения двух объектов, переданных ему в качестве параметров.

interface IComparer

{

int Compare(object obj1,object obj2)

}

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

Модернизируем предыдущий пример и отсортируем массив экземпляров класса Monster по двум критериям – по именам (свойство Имя, класс SortByИмя) и умениям (свойство Умение, класс SortByУмение). Классы критериев сортировки объявлены вложенными, так как требуются только экземплярам класса Monster.