Студопедия

КАТЕГОРИИ:


Архитектура-(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 -(ThreeDopl, ThreeD op2)

Тип_параметра2 операнд2)

Тип_параметра1 операнд1,

Public static тип_возврата operator op(

Public static тип_возврата operator ор(

тип_параметра операнд)

{

// операции

}

// Общий формат перегрузки для бинарного оператора,

{

// операции

}

Здесь элемент ор — это оператор (например " + " или " / "), который перегружается.Элемент тип_возврата — это тип значения, возвращаемого при выполнении заданной операции. Несмотря на то, что можно выбрать любой тип, тип возвращаемогозначения чаще всего будет совпадать с типом класса, для которого этот оператор перегружается. Такая корреляция облегчает использование перегруженного оператора ввыражениях. Для унарных операторов операнд передается в элементе операнд, а для бинарных — в элементах операнд1 и операнд2.

Для унарных операторов тип операнда должен совпадать с классом, для которого определен оператор. Что касается бинарных операторов, то тип хотя бы одного операнда должен совпадать с соответствующим классом. Таким образом, С#-операторынельзя перегружать для классов, не созданных вами. Например, вы не можете перегрузить оператор "+" для типов int или string.

И последнее: параметры операторов не должны использовать модификатор ref или out.

4.3.1 Перегрузка бинарных операторов

В следующей программе создаётся класс ThreeD поддержки координат объекта в трехмерном пространстве.

Перегруженный оператор "+" выполняет сложение отдельных координат двух ThreeD -объектов, а перегруженный оператор "-" вычитает координаты одного ThreeD -объекта из координат другого.

// Пример перегрузки операторов.

usingSystem;

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

classThreeD {

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

publicThreeD () { x = у = 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.у + ор2.у; // целочисленное сложение,

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

returnresult;

}

// Перегрузкабинарногооператора "-".

{

ThreeDresult = newThreeD();

/* Обратите внимание на порядок операндов.

opl - левый операнд, ор2 - правый. */

result.х = opl.x - ор2.х; // Эти операторы выполняют

result.у = opl.у - ор2.у; // целочисленное вычитание,

result.z = opl.z - op2.z;

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 ThreeDdO, 10, 10);

ThreeD с = new ThreeD();

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

a.show();

Console.WriteLine();

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

b. show();

Console.WriteLine();

с = a + b; // Складываем а и b.

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

с.show();

Console.WriteLine();

c = a + b + c; // Складываемa, bис.

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

с.show();

Console.WriteLine();

с = с - a; // Вычитаем а из с.

Console.Write("Результат вычитания с - а: ");

с.show();

Console.WriteLine();

с = с - b; // Вычитаем b из с.

Console.Write("Результат вычитания с - b: ");

с.show();

Console.WriteLine();

}}

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

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

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

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

Результат сложения а + b + с: 22, 24, 26

Результат вычитания с - а: 21, 22, 23

Результат вычитания с - b: 11, 12, 13

 

При воздействии оператора " + " на два объекта типа ThreeD величины соответствующих координат суммируются, как показано в методе operator+(). Однако заметьте, что этот метод не модифицирует значения ни одного из операндов. Этот метод возвращает новый объект типа ThreeD, который содержит результат выполнения рассматриваемой операции. Это происходит и в случае стандартного арифметического оператора сложения "+", примененного, например, к числам 10 и 12. Результат операции 10+12 равен 22, но при его получении ни 10, ни 12 не были изменены. Хотя не существует правила, которое бы не позволяло перегруженному оператору изменять значение одного из его операндов, все же лучше, чтобы он не противоречил общепринятым нормам. Обратите внимание на то, что метод operator+() возвращает объект типа ThreeD.

Несмотря на то что он мог бы возвращать значение любого допустимого в С# типа, тот факт, что он возвращает объект типа ThreeD, позволяет использовать оператор "+" в таких составных выражениях, как а+b+с Здесь часть этого выражения, а+b, генерирует результат типа ThreeD, который затем суммируется с объектом с. И если бы выражение генерировало значение иного типа (а не типа ThreeD), такое составное выражение попросту не работало бы. При сложении координат внутри метода operator+() выполняется целочисленное сложение, поскольку отдельные координаты представляют собой целочисленные величины. Факт перегрузки оператора "+" для объектов типа ThreeD не влияет на оператор "+", применяемый к целым числам.

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

 

4.3.2 Перегрузка унарных операторов

Унарные операторы перегружаются точно так же, как и унарные. Главное отличие, конечно же, состоит в том, что в этом случае существует только один операнд. Рассмотрим, например, метод, который перегружает унарный " минус " для класса ThreeD.

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

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


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


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



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




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