Программирование >>  Обработка исключительных ситуаций 

1 ... 31 32 33 [ 34 ] 35 36 37 ... 142


Сортировка по вооружению:

Monster Маша healltth = 40 ammo 10

Monster Вася healltth = 50 ammo 50

Monster Петя healltth = 80 ammo 80

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

Если класс реализует интерфейс IComparable, его экземпляры можно сравнивать между собой по принципу больше или меньше. Логично разрешить использовать для этого операции отношения, перегрузив их. Операции должны перегружаться парами: < и >, <= и >=, == и ! =. Перегрузка операций обычно выполняется путем делегирования, то есть обращения к переопределенным методам Сотрагето и тана Is.

ПРИМЕЧАНИЕ-

Если класс реализует интерфейс IComparable, требуется переопределить метод fcqual s и связанный с ним метод GetHashCode. Оба метода унаследованы от базового класса object. Пример перегрузки был приведен в разделе Класс object* (см. с. 183).

В листинге 9.3 операции отношения перегружены для класса Monster. В качестве критерия сравнения объектов по принципу больше или меньше выступает поле health, а при сравнении на равенство реализуется значимая семантика, то есть попарно сравниваются все поля объектов

Листинг 9.3. Перегрузка операций отношения using System;

namespace ConsoleApplicationi

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 II GetTypeO != obj.GetType() ) return false;

Monster temp = (Monster) obj; return health == temp.health &&

ammo == temp.ammo &&

name == temp.name;

public override int GetHashCode()



Листинг 9.3 (продолжение) {

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 j;

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 if ( this.health < temp.health return 0;

return 1; return -1 :

string name;

int health, ammo;

class Classl { static void Main()

Monster Вася = new Monster( 70, 80, Вася ); Monster Петя = new Monster( 80, 80, Петя );

( Вася > Петя ) Console.WriteLine( Вася больше Пети );

else else

if ( Вася = Петя )

Console.WriteLine( Console.WriteLine(

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

Результат работы программы не разочаровывает: Зася меньше Пети

Клонирование объектов (интерфейс ICIoneable)

Клонирование - это создание копии объекта. Копия объекта называется клоном. Как вам известно, при присваивании одного объекта ссылочного типа другому копируется ссылка, а не сам объект (рис. 9.1, а). Если необходимо скопировать в другую область памяти поля объекта, можно воспользоваться методом wemberwiseClone, который любой объект наследует от класса object. При этом объекты, на которые указывают поля объекта, в свою очередь являющиеся ссылками, не копируются (рис. 9.1, б). Это называется поверхностным клонированием.


Рис. 9.1 . Клонирование объектов



1 ... 31 32 33 [ 34 ] 35 36 37 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика