Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Public static ThreeD operator -(ThreeD op)

{ThreeD result = new ThreeD();

result.x = -op.x;

result.у = -op.у;

result.z = -op.z;

returnresult;}

Здесь создается новый объект, который содержит поля операнда, но со знаком "минус". Созданный таким образом объект и возвращается операторным методом operator-(). Обратите внимание на то, что сам операнд остается не модифицированным. Такое поведение соответствует обычному действию унарного "минуса". Например, в выражении

а = -b

а получает значение b, взятое с противоположным знаком, но само b при этом не меняется.

 

Однако в двух случаях операторный метод изменяет содержимое операнда. Речь идет об операторах инкремента (++) и декремента (--). Поскольку обычноэти операторы выполняют функции инкрементирования и декрементирования значений, соответственно, то перегруженные операторы "+" и " - ", как правило, инкрементируют свой операнд. Таким образом, при перегрузке этих операторов операнд обычно модифицируется. Например, рассмотрим метод operator++ () для класса ThreeD.

// Перегрузкаунарногооператора "++".

public static ThreeD operator ++(ThreeD op)

{// Оператор "++" модифицирует аргумент.

op.x++;

op.y++;

op.z++;

return op;}

Обратите внимание: в результате выполнения этого операторного метода объект, на который ссылается операнд ор, модифицируется. Итак, операнд, подвергнутый операции "++", инкрементируется. Более того, модифицированный объект возвращается этим методом, благодаря чему оператор "++" можно использовать в более сложных выражениях.

 

4.3.3 Выполнение операций над значениями встроенных С#типов

Вы видели, как перегрузить оператор "+", чтобы он суммировал координаты одного ThreeD -объекта с координатами другого. Однако это не единственный способ определения операции сложения для класса ThreeD. Например, может потребоваться суммирование какого-либо целого числа с каждой координатой ThreeD -объекта. Ведь тогда эту операцию можно использовать для смещения осей. Для ее реализации необходимо перегрузить оператор"+" еще раз, например, так:

// Перегружаем бинарный оператор "+" для суммирования

// объектаиint-значения.

public static ThreeD operator +(ThreeDopl, int op2)

{ThreeD result = new ThreeD();

result.x = opl.x + op2;

result.у = opl.у + op2;

result.z = opl.z + op2;

returnresult;}

Обратите внимание на то, что второй параметр имеет тип int. Таким образом,этот метод позволяет сложить int -значение с каждым полем ThreeD -объекта. Этовполне допустимо, поскольку, как разъяснялось выше, при перегрузке бинарного оператора тип только одного из его операндов должен совпадать с типом класса, для которого перегружается этот оператор. Другой операнд может иметь любой тип.

Ниже приведена версия класса ThreeD, которая имеет два перегруженных метода operator+().

/* Перегрузка оператора сложения для вариантов:объект + объект и объект + int-значение. */

usingSystem;

// Класс трехмерных координат,

classThreeD {

int x, у, z; // 3-х-мерные координаты.

publicThreeD() { х = у = z = 0; }

publicThreeD(inti, int j, int k) {x = i; у = j; z = k; }

// Перегружаем бинарный оператор " + " для варианта

// "объект + объект".

public static ThreeD operator +(ThreeDopl, ThreeD op2)

{ThreeDresult = newThreeD();

/* Суммирование координат двух точеки возврат результата. */

result.x = opl.x + op2.x;

result.у = opl.y + op2.y;

result.z = opl.z + op2.z;

returnresult;}

// Перегружаем бинарный оператор "+" для варианта

// "объект + int-значение".

public static ThreeD operator +(ThreeDopl, int op2)

{

ThreeD result = new ThreeD();

result.x = opl.x + op2;

result.у = opl.y + op2;

result.z = opl.z + op2;

return result;}

// Отображаемкоординаты X, Y, Z.

public void show()

{

Console.WriteLine(x + ", " + у + ", " + z);

}

}

classThreeDDemo {

public static void Main() {

ThreeD a = new ThreeD(1, 2, 3);

ThreeD b = new ThreeD (10, 10, 10);

ThreeDс = new ThreeD();

Console.Write("Координатыточкиа: ");

a.show();

Console.WriteLine();

Console.Write("Координатыточки b: ");

b.show();

Console.WriteLine();

с = a + b; // объект + объект

Console.Write("Результат сложения а + b: ");

с.show();

Console.WriteLine();

с = b + 10; // объект + int-значение

Console.Write("Результат сложения b + 10: ");

с.show();

}}

При выполнении программа генерирует следующие результаты:

Координаты точки а: 1, 2, 3

Координаты точки b: 10, 10, 10

Результат сложения а + b: 11, 12, 13

Результат сложения b + 10: 20, 20, 20

 

 

4.3.4Перегрузка операторов отношений

Операторы отношений (например, "==" или "<") также можно перегружать. Как правило, перегруженный оператор отношения возвращает одно из двух возможных значений: true или false. Это позволяет использовать перегруженные операторы отношений в условных выражениях.

Рассмотрим версию класса ThreeD, который перегружает операторы " < " и " > ".

// Перегрузка операторов "<" и ">".

usingSystem;

// Класс трехмерных координат,

classThreeD {

int x, у, z; // 3-х-мерные координаты.

publicThreeD () { х = у = z = 0; }

publicThreeD(inti, int j, int k) {

x = i; у = j; z = k; }

// Перегрузка оператора "<".

public static bool operator <(ThreeDopl, ThreeD op2)

{

if((opl.x< op2.x) && (opl.у< op2.y) &&

(opl.z< op2.z))

return true;

<== предыдущая лекция | следующая лекция ==>
Public static ThreeD operator -(ThreeDopl, ThreeD op2) | Public static implicit operator int(ThreeDopl)
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 375; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.