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

9.5.3 Перевантаження операцій відношення

Якщо клас реалізує інтерфейс IСomparable, його екземпляри можна порівнювати між собою за принципом більше або менше. Логічно дозволити використовувати для цього операції відношення, які перенавантажують їх. Операції повинні перевантажуватися парами: < і >, <= і >= == і ! =. Перевантаження операцій зазвичай виконується шляхом делегування, тобто звернення до перевизначених методів Соmpare і Equals.

Якщо клас реалізує інтерфейс IСomparable, потрібно перевизначити метод Equals і пов'язаний з ним метод GetHashcode. Обидва методи успадковано від базового класу object.

У лістингу 9.4 операцій відношення перевантажені для класу Monster. Як критерій порівняння об'єктів за принципом більше або менше виступає поле health, а при порівнянні на рівність реалізується значуща семантика, тобто попарно порівнюються всі поля об'єктів

Лістинг 9.4. Перевантаження операцій відношення

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace examp57

{

class Monster : IComparable

{

string name;

int health;

int ammo;

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

{

this. health = health;

this.ammo = ammo;

this.name = name;

}

public override bool Equals( object obj )

{

if ( obj == null || GetType() != obj.GetType() ) return false;

Monster temp = (Monster) obj;

return health == temp.health

&& ammo == temp.ammo

&& name == temp.name;

}

public override int GetHashCode()

{

return name.GetHashCode();

}

public static bool operator ==( Monster a, Monster b )

{

return a.Equals( b );

}

// варіант оператора:

// public static bool operator == ( Monster a. Monster b )

// {

// return ( a.CompareTo( b ) == 0 ):

// }

public static bool operator != ( Monster a, Monster b )

{

return !a.Equals(b);

}

// варіант:

// public static bool operator != ( Monster a, Monster b )

// {

// return ( a.CompareTo( b ) != 0 );

// }

public static bool operator < ( Monster a, Monster b )

{return ( a.CompareTo( b ) < 0);}

public static bool operator > ( Monster a, Monster b )

{return ( a.CompareTo( b ) > 0);}

public static bool operator <= (Monster a, Monster b)

{return ( a.CompareTo(b) <= 0 );}

public static bool operator >= ( Monster a, Monster b )

{return ( a.CompareTo( b ) >= 0);}

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;

}

}

class Program

{

static void Main(string[] args)

{

Monster Вася = new Monster( 70, 80, "Вася" );

Monster Петя = new Monster( 80, 80, "Петя" );

if ( Вася > Петя ) Console.WriteLine ("Вася більше Петі" );

else if ( Вася == Петя ) Console.WriteLine("Вася = Петя" );

else Console.WriteLine("Вася менше Петі");

}

}

}

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

Вася менше Петі