Если класс реализует интерфейс IComparable, его экземпляры можно сравнивать между собой по принципу больше или меньше. Логично разрешить использовать для этого операции отношения, перегрузив их. Операции должны перегружаться парами: < и >, <= и >=, == и!=. Перегрузка операций обычно выполняется путем делегирования, то есть обращения к переопределенным методам СоmрагеТо и Equals.
ПРИМЕЧАНИЕ
Если класс реализует интерфейс IComparable, требуется переопределить метол Equals и связанный с ним метод GetHashCode. Оба метода унаследованы от базового класса object. Пример перегрузки был приведен в разделе «Класс object» (см. с. 183).
В листинге 9.3 операции отношения перегружены для класса Monster. В качестве критерия сравнения объектов по принципу больше или меньше выступает поле health, а при сравнении на равенство реализуется значимая семантика, то есть попарно сравниваются все поля объектов
Листинг 9.3. Перегрузка операций отношения
using System;
namespace ConsoleApplication1
{
class Monster: IComparable
{
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;
}
string name; int health, ammo;
}
class Class1
{
static void Main()
{
Monster Вася = new Monster(70, 80, "Вася");
Monster Петя = new Monster(80, 80, "Петя");
if (Вася > Петя)
Console.WriteLine("Вася больше Пети");
else if (Вася == Петя)
Console.WriteLine("Вася == Петя");
else
Console.WriteLine("Вася меньше Пети");
}
}
}
Результат работы программы не разочаровывает:
Вася меньше Пети