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

С# - Ватсон К.

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


Чтобы перегрузить оператор +, нам потребуется создать следующий код: public class AddClasel

<

public int val;

public Static AddClassl operator' + (AddClassl opl, AddClassl op2)

t

AddClasel retumVal * new AddClassU); returnVal.val * opl.val + op2.valI return returnValj

)

)

Как легко можно заметить, перегрузка оператора очень напоминает объявление стандартного статичного метода, за исключением того, что в данном случае используется ключевое слово operator и сам оператор вместо имени метода.
Дополнительные сведения о классах

245

Теперь мы можем с успехом применить оператор + с операндами данного класса, что мы пытались сделать в предыдущем примере:

AddClassl орЗ = opl + ор2;

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

public class AddClassl

{

public int val;

public static AddClassl operator +(AddClassl opl, AddClassl op2)

(

AddClassl returnVal = new AddClassl (); returnVal.val ¦* opl.val + op2.val; return returnVal;

>

public static AddClassl operator -(AddClassl opl)

(

AddClassl returnVal ¦ new AddClassl{)t returnVal.val - -opl.val; return returnVal(

)

)

Оба этих оператора работают с операндами того же типа, что и сам класс, н возвращают значения этого же типа. Давайте, однако, рассмотрим определения следующих классов:

public class AddClassl {

public int val; '

public static Addclass3 operator +(AddClassl opl, AddClass2 op2)

(

AddClass3 returnVal ¦ new AddClass3 () ,-retumVal.val = opl.val + op2,valj return returnVal)

>

public class Addclase2 public int val;

public class AddClass3

<

public int val;

В этом случае следующий код будет вполне допустимым:

IdClassl opl * new AddClassl О i opl.val =5; .

AddClass2 op2 = new AddClass2{); op2.val ¦ 5;

AddClas33 орЗ _ opl + op2;

Там, где это необходимо, имеется возможность использовать таким образом различные типы. Обратите, однако, внимание, что если мы добавим тот же оператор в класс Addciase2, то приведенный выше код работать не будет, поскольку
246

Глава 11

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

Необходимо следить и за тем, чтобы в случае использования операндов различных типов операнды следовали в том же порядке, что и параметры при описании оператора. Если мы попытаемся воспользоваться перегруженным оператором, задав операнды в "неправильном” порядке, операция выполнена не будет. Следующий оператор является недопустимым:

AddClossJ орЗ Ц ор2 + opl;

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

public static AddClass3 operator +{AddClass2 opl, AddClassl op2)

AddClax returnVal ¦ пек AddClaee3{); retumVal.val ¦ opl.val + op2.val; ¦

return retumVal;

Перегрузка допускается для следующих операторов:

? Унарные операторы: + , true, false

? Бинарные операторы: +, *, /, %, &, |, ", <<, >>

? Операторы сравнения: -=*, !—, <, >, <=, >«•

Если перегружаются операторы true и false, то мы получаем возможность использовать классы в логических выражениях, например, if (opi) о.

Не предусмотрена возможность перегружать операторы присваивания, такие как +—, однако эти операторы состоят из простых операторов (в данном случае +), поэтому нам не приходится об этом беспокоиться. Перегрузка оператора + приведет к тому, что оператор +— будет работать так, как нам нужно, В него входит также и оператор “, однако перегружать его ие имеет никакого смысла, поскольку его использование универсально. Этот оператор, однако, может иметь отношение к определяемым пользователем операциям отношения, о которых мы будем говорить в следующем разделе.

Также ие существует возможности перегружать операторы && и {|, однако в этом случае мы снова обращаемся к использованию составляющих их более простых операторов — & и |, и их перегрузки оказывается вполне достаточно.

Некоторые операторы, например, такие как < и >, должны перегружаться парами. Другими словами, мы не можем перегрузить <, если не будет перегружен н >. В большинстве случаев существует возможность просто вызывать данные операторы при описании других, что позволяет уменьшить необходимое число строк кода (и возможных ошибок), например:

public class AddClassl

(

public int val;

public etatic bool operator >«(AddClassl opl, MClassl op2)

?

return (opl.val >= ops.val);

)
Дополнительные сведения о классах__________ 247

public etatic bool operator <(AddClassl opl, AddClassl op2)

{

return M opl-val >* op2. val) ;

)

it Необходимо также реализовать операторы <=*(*'>

}

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

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

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

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

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