Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Ватсон К. -> "С#" -> 118

С# - Ватсон К.

Ватсон К. С# — Лори, 2005 . — 879 c.
ISBN 1-861004-98-2
Скачать (прямая ссылка): vatsonc2005.pdf
Предыдущая << 1 .. 112 113 114 115 116 117 < 118 > 119 120 121 122 123 124 .. 404 >> Следующая


Все вышесказанное относится и к операторам и !", однако для них часто имеет смысл переопределение функций Object. Equals () и Ob j ect. GetHashCode (), поскольку обе они могут использоваться для сравнения объектов. Переопределяя эти методы, мы получаем возможность гарантировать, что независимо от методов, применяемых пользователями данного класса, полученные результаты будут одинаковыми, Это не является необходимым, но это стоит сделать ради завершенности. Для этого потребуются следующие нестатическне переопределенные методы:

public class AddClassl (

public int val;

public static bool operator ==(AddClassl opl, AddClassl op2)

return (opl.val == op2.val);

)

public static bool operator ;=(AddClassl opl, AddClassl op2)

(

return 1(opl == op2);

>

public override bool Equals (object opl)

?

returnval == ((AddClassl)opl) .val;

public override int GetHasbCode () return vali

>

Обратите внимание, что функции Equals о передается параметр типа object. Такая сигнатура оказывается необходимой, иначе получится, что мы перегружаем этот метод, вместо того чтобы переопределять его, и реализация по умолчанию по-прежнему будет доступна пользователям данного класса. Это означает, что для получения необходимого результата нам потребуется приведение типов (хотя для придания коду большей стройности могут понадобиться дополнительные действия, поскольку приведенный выше пример не будет работать о тех случаях, когда параметр opl не является экземпляром класса AddClassl или экземпляром производного от него класса).

Функция GetHashCode () применяется для получения значения типа int, уникального для данного экземпляра объекта и зависящего от его состояния. В данном случае использование поля val оказывается вполне допустимым, поскольку оно также имеет значение типа int,
248

Глава 11

Операторы преобразования типов

Помимо перегрузки математических операторов, продемонстрированной выше, существует возможность определять как неявное, так и явное преобразование типов. Это оказывается необходимым п том случае, если мы хотим выполнять преобразования между типами, fie имеющими между собой отношений, например, когда они не связаны иерархией наследования и не имеют общих интерфейсов.

Пусть мы описали неявное преобразование между классом convciassi и классом convclase2, Это означает, что теперь можно написать следующий код:

convclaeel opl = new convciassi(); convclass2 op5 => opl;

В качестве альтернативы мы можем описать явное преобразование, которое будем вызывать с помощью следующего кода:

convclaaul opl “ пей convciassiО; convclass2 орЗ ¦ (convclass2)opl;

Давайте в качестве примера рассмотрим следующий код: public class convciassi {

public int val;

public static implicit operator convciassi(convciassi opl)

< ¦

convciassi returnVal - new convclaes2(); returnVal,val = opl.valг return returnVal)

]

)

public class convclassZ (

public double val;

public static explicit operator convciassi(convclaas2 opl)

(

convclaeel retumVal = new convciassi(); checked (returnVal.val * fint)opl,val;>; return returnVal;

J

)

В данном случае convciassi содержит значение тнпа int, a convciass2 содержит значение тнпа double. Поскольку значения типа int могут неявно преобразовываться в значения типа double, то существует возможность описать неявное преобразование между convciassi и convclass2. Однако поскольку обратное неверно, мы вынуждены описывать оператор преобразования convciass2 в convciassi как явный.

В программе это было задано с помощью ключевых слов implicit н explicit.

Для описанных выше классов следующий код является вполне допустимым:

convclaeel opl = new convciassiО; opl.val - 3; convclass2 op2 “ opl;

Однако преобразование в обратном направлении требует следующего явного изменения тнпа:
Дополнительные сведения о классах

249

convclaes2 opl = new convclasa2 0; opl.val = 3elS;

convclaeel op2 * (convclass1)opl ;

Обратите внимание, что поскольку при описании явного преобразования нами было использовано ключевое слово checked, в приведенном выше коде мы получим исключительную ситуацию, так как значение свойства val у opl слишком велико и не может быть присвоено свойству val opz.

Усовершенствование CardLib, часть 2

Теперь давайте снова модернизируем проект chllcardLib, добавив в него перегрузку операторов для класса, описывающего карты. Для начала, однако, мы добавим в класс card некоторые дополнительные поля, которые позволят нам описывать козырную масть и использовать туз в качестве самой старшей карты. Мы описываем их как static, поскольку, после того как они определены, они могут применятся ко всем объектам типа Card:

public class Card (

II Паркер, свидетельствующий об использований козырей. Если ему И присвоено значение tn , то козыри имеют более высохое старшинство,

// чек карты всех остальных мастей. '

public etatic bool useTrumps = false;

// Указывает на то, какая именно масть является козырной в тон случае,
Предыдущая << 1 .. 112 113 114 115 116 117 < 118 > 119 120 121 122 123 124 .. 404 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.