Якщо клас реалізує інтерфейс 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("Вася менше Петі");
}
}
}
Результат роботи програми:
Вася менше Петі