русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


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


Дата додавання: 2015-01-08; переглядів: 1311.


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

 

}

}

}

 

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

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

 


<== попередня лекція | наступна лекція ==>
Інтерфейси і спадкоємство | Строго кажучи, будь-який значущий тип С# є структурним.


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн