Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие КНЕУ.doc
Скачиваний:
24
Добавлен:
07.03.2016
Размер:
3.9 Mб
Скачать

9.5. Стандартні інтерфейси .Net

У бібліотеці класів .NET визначена множина стандартних інтерфейсів, задаючих бажану поведінку об'єктів. Наприклад, інтерфейс IComparable задає метод порівняння об'єктів за принципом більше або менше, що дозволяє виконувати їх сортування. Реалізація інтерфейсів IEnumerable і IEnumerator дає можливість проглядати вміст об'єкту за допомогою конструкції foreach, а реалізація інтерфейсу ICloneable - клонувати об'єкти.

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

9.5.1. Порівняння об'єктів (інтерфейс iComparable)

Інтерфейс IComparable визначений в просторі імен System. Він містить всього один метод CompareTo, що повертає результат порівняння двох об'єктів, - поточного і переданого йому як параметр:

interface IComparable

{

int CompareTo( object obj )

}

Метод повинен повертати:

  • 0, якщо поточний об'єкт і параметр рівні;

  • від’ємне число, якщо поточний об'єкт менше параметра;

  • додатне число, якщо поточний об'єкт більше параметра.

Реалізуємо інтерфейс IComparable в знайомому нам класі Monster. Як критерій порівняння об'єктів виберемо поле health. У лістингу 9.2 приведена програма, що сортує масив монстрів за збільшенням величини, що характеризує їх здоров'я (елементи класу, що не використовуються в даній програмі, не приводяться).

Лістинг 9.2. Приклад реалізації інтерфейсу IComparable

usingSystem;

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

namespace examp55

{

class Monster : IComparable

{

public Monster(int health, int ammo, string name)

{

this.health = health ;

this.ammo = ammo;

this.name = name;

}

virtual public void Passport()

{

Console.WriteLine("Monster {0} \t healt h = {1} ammo = {2}",

name, health, ammo);

}

public int CompareTo(object obj) // реализація інтерфейсу

{

Monster temp = (Monster)obj;

if (this.health > temp.health) return 1;

if (this.health < temp.health) return -1;

return 0;

}

string name;

int health, ammo;

}

class Class1

{

static void Main()

{

const int n = 3;

Monster[] stado = new Monster[n];

stado[0] = new Monster(50, 50, "V");

stado[1] = new Monster(80, 80, "P");

stado[2] = new Monster(40, 10, "M");

Array.Sort(stado); // сортування стало можливим

foreach (Monster elem in stado) elem.Passport();

}

}

}

Результат роботи програми:

Monster Маша health = 40 ammo = 10

Monster Вася health = 50 ammo = 50

Monster Петя health = 80 ammo = 80

Якщо декілька об'єктів мають однакове значення критерію сортування, їх відносний порядок проходження після сортування не зміниться.

У багатьох алгоритмах потрібно виконувати сортування об'єктів по різних критеріях. У С# для цього використовується інтерфейс IComparer.