|
Программирование >> Обработка исключительных ситуаций
Сортировка по вооружению: 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 . Клонирование объектов
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |