Перегрузка операций отношения

Если класс реализует интерфейс 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("Вася меньше Пети");

}

}

}

Результат работы программы не разочаровывает:

Вася меньше Пети


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: