Чтение онлайн

на главную - закладки

Жанры

Полное руководство. С# 4.0
Шрифт:

Координаты точки а: 1, 2, 3 Координаты точки b: 10, 10, 10 Результат сложения а + b: 11, 12, 13 Результат сложения а + b + с: 22, 24, 26 Результат вычитания с - а: 21, 22, 23 Результат вычитания с - b: 11, 12, 13 Результат присваивания -а: -1, -2, -3 Если с = а++ то координаты точки с равны 1, 2, 3 а координаты точки а равны 2, 3, 4 Установка исходных координат точки а: 1, 2, 3 Если с = ++а то координаты точки с равны 2, 3, 4 а координаты точки а равны 2, 3, 4 ## Выполнение операций со встроенными в C# типами данных Для любого заданного класса и оператора имеется также возможность перегрузить сам операторный метод. Это, в частности, требуется для того, чтобы разрешить опера ции с типом класса и другими типами данных, в том числе и встроенными. Вновь об ратимся к классу ThreeD. На примере этого класса ранее было показано, как оператор + перегружается для сложения координат одного объекта типа ThreeD

с координата ми другого. Но это далеко не единственный способ определения операции сложения для класса ThreeD. Так, было бы не менее полезно прибавить целое значение к каждой координате объекта типа ThreeD. Подобная операция пригодилась бы для переноса осей координат. Но для ее выполнения придется перегрузить оператор + еще раз, как показано ниже.

// Перегрузить бинарный оператор + для сложения объекта // типа ThreeD и целого значения типа int. public static ThreeD operator +(ThreeD op1, int op2) { ThreeD result = new ThreeD; result.x = op1.x + op2; result.у = op1.y + op2; result.z = op1.z + op2; return result; } Как видите, второй параметр операторного метода имеет тип int. Следовательно, в этом методе разрешается сложение целого значения с каждым полем объекта типа ThreeD. Такая операция вполне допустима, потому что, как пояснялось выше, при перегрузке бинарного оператора один из его операндов должен быть того же типа, что и класс, для которого этот оператор перегружается. Но у второго операнда этого оператора может быть любой другой тип. Ниже приведен вариант класса ThreeD с двумя перегружаемыми методами опе ратора +.

// Перегрузить бинарный оператор + дважды: // один раз - для сложения объектов класса ThreeD, // а другой раз — для сложения объекта типа ThreeD и целого значения типа int. using System;

// Класс для хранения трехмерных координат. class ThreeD { int х, у, z; // трехмерные координаты public ThreeD { x = у = z = 0; } public ThreeD(int i, int j, int k) { x = i; у = j; z = k; } // Перегрузить бинарный оператор + для сложения объектов класса ThreeD. public static ThreeD operator + (ThreeD op1, ThreeD op2) { ThreeD result = new ThreeD; / Сложить координаты двух точек и возвратить результат. / result.х = op1.x + ор2.х; result.у = op1.у + ор2.у; result.z = op1.z + op2.z; return result; } // Перегрузить бинарный оператор + для сложения // объекта типа ThreeD и целого значения типа int. public static ThreeD operator +(ThreeD opl, int op2) { ThreeD result = new ThreeD; result.x = op1.x + op2; result.у = op1.у + op2; result.z = op1.z + op2; return result; } // Вывести координаты X, Y, Z. public void Show { Console.WriteLine(x + ", " + у + ", " + z); } }

class ThreeDDemo { static void Main { ThreeD a = new ThreeD(1, 2, 3); ThreeD b = new ThreeD(10, 10, 10); ThreeD с = new ThreeD; Console.Write("Координаты точки a; "); a.Show; Console.WriteLine; Console.Write("Координаты точки b: "); b.Show; Console.WriteLine; с = a + b; // сложить объекты класса ThreeD Console.Write("Результат сложения a + b: "); c.Show; Console.WriteLine; c = b + 10; // сложить объект типа ThreeD и целое значение типа int Console.Write("Результат сложения b + 10: "); с.Show; }

} При выполнении этого кода получается следующий результат.

Координаты точки а: 1, 2, 3 Координаты точки b: 10, 10, 10 Результат сложения а + b: 11, 12, 13 Результат сложения b + 10: 20, 20, 20 Как подтверждает приведенный выше результат, когда оператор + применяется к двум объектам класса ThreeD, то складываются их координаты. А когда он применяет ся к объекту типа ThreeD и целому значению, то координаты этого объекта увеличи ваются на заданное целое значение. Продемонстрированная выше перегрузка оператора +, безусловно, расширяет по лезные функции класса ThreeD, тем не менее, она делает это не до конца. И вот по чему. Метод operator+(ThreeD, int) позволяет выполнять операции, подобные следующей.

ob1 = оb2 + 10; Но, к сожалению, он не позволяет выполнять операции, аналогичные следующей.

ob1 = 10 + оb2; Дело в том, что второй целочисленный аргумент данного метода обозначает правый операнд бинарного оператора +, но в приведенной выше строке кода целочисленный аргумент указывается слева. Для того чтобы разрешить выполнение такой операции сложения, придется перегрузить оператор + еще раз. В этом случае первый параметр операторного метода должен иметь тип int, а второй параметр — тип ThreeD. Таким образом, в одном варианте метода operator+ выполняется сложение объекта типа ThreeD и целого значения, а во втором — сложение целого значения и объекта типа ThreeD. Благодаря такой перегрузке оператора + (или любого другого бинарного опе ратора) допускается появление встроенного типа

данных как с левой, так и с правой стороны данного оператора. Ниже приведен еще один вариант класса ThreeD, в кото ром бинарный оператор + перегружается описанным выше образом.

// Перегрузить бинарный оператор + трижды: // один раз — для сложения объектов класса ThreeD, // второй раз — для сложения объекта типа ThreeD и целого значения типа int, // а третий раз — для сложения целого значения типа int и объекта типа ThreeD. using System;

// Класс для хранения трехмерных координат. class ThreeD { int х, у, z; // трехмерные координаты public ThreeD { x = y = z = 0; } public ThreeD(int i, int j, int k) { x = i; у = j; z = k; } // Перегрузить бинарный оператор + для сложения объектов класса ThreeD. public static ThreeD operator +(ThreeD op1, ThreeD op2) { ThreeD result = new ThreeD; / Сложить координаты двух точек и возвратить результат. / result.х = op1.x + ор2.х; result.у = op1.y + ор2.у; result.z = op1.z + op2.z; return result; } // Перегрузить бинарный оператор + для сложения // объекта типа ThreeD и целого значения типа int. public static ThreeD operator +(ThreeD op1, int op2) { ThreeD result = new ThreeD; result.x = op1.x + op2; result.у = op1.y + op2; result.z = op1.z + op2; return result; } // Перегрузить бинарный оператор + для сложения // целого значения типа int и объекта типа ThreeD. public static ThreeD operator +(int op1, ThreeD op2) { ThreeD result = new ThreeD; result.x = op2.x + op1; result.у = op2.y + op1; result.z = op2.z + op1; return result; } // Вывести координаты X, Y, Z. public void Show { Console.WriteLine(x + ", " + у + ", " + z); } }

class ThreeDDemo { static void Main { ThreeD a = new ThreeD(l, 2, 3); ThreeD b = new ThreeD(10, 10, 10); ThreeD с = new ThreeD; Console.Write("Координаты точки a: "); a.Show; Console.WriteLine; Console.Write("Координаты точки b: "); b.Show; Console.WriteLine; с = a + b; // сложить объекты класса ThreeD Console.Write("Результат сложения a + b: "); c.Show; Console.WriteLine; c = b + 10; // сложить объект типа ThreeD и целое значение типа int Console.Write("Результат сложения b + 10: "); с.Show; Console.WriteLine; с = 15 + b; // сложить целое значение типа int и объект типа ThreeD Console.Write("Результат сложения 15 + b: "); с.Show; }

} Выполнение этого кода дает следующий результат.

Координаты точки а: 1, 2, 3 Координаты точки b: 10, 10, 10 Результат сложения а + b: 11, 12, 13 Результат сложения b + 10: 20, 20, 20 Результат сложения 15 + b: 25, 25, 25 ### Перегрузка операторов отношения Операторы отношения, например == и <, могут также перегружаться, причем очень просто. Как правило, перегруженный оператор отношения возвращает ло гическое значение true и false. Это вполне соответствует правилам обычного применения подобных операторов и дает возможность использовать их перегру жаемые разновидности в условных выражениях. Если же возвращается результат другого типа, то тем самым сильно ограничивается применимость операторов от ношения. Ниже приведен очередной вариант класса ThreeD, в котором перегружаются операторы < и >. В данном примере эти операторы служат для сравнения объектов ThreeD, исходя из их расстояния до начала координат. Один объект считается больше другого, если он находится дальше от начала координат. А кроме того, один объект считается меньше другого, если он находится ближе к началу координат. Такой вари ант реализации позволяет, в частности, определить, какая из двух заданных точек на ходится на большей сфере. Если же ни один из операторов не возвращает логическое значение true, то обе точки находятся на одной и той же сфере. Разумеется, возможны и другие алгоритмы упорядочения.

// Перегрузить операторы < и >. using System;

// Класс для хранения трехмерных координат. class ThreeD { int х, у, z; // трехмерные координаты public ThreeD { х = у = z = 0; } public ThreeD(int i, int j, int k) { x = i; у = j; z = k; } // Перегрузить оператор <. public static bool operator <(ThreeD op1, ThreeD op2) { if(Math.Sqrt(op1.x op1.x + op1.y op1.y + op1.z op1.z) < Math.Sqrt(op2.x op2.x + op2.у op2.y + op2.z op2.z)) return true; else return false; } // Перегрузить оператор >. public static bool operator >(ThreeD op1, ThreeD op2) { if(Math.Sqrt(op1.x op1.x + op1.y op1.y + op1.z op1.z) > Math.Sqrt(op2.x op2.x + op2.у op2.у + op2.z op2.z)) return true; else return false; } // Вывести координаты X, Y, Z. public void Show { Console.WriteLine(x + ", " + у + ", " + z); } }

Поделиться:
Популярные книги

Дракон с подарком

Суббота Светлана
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Дракон с подарком

Бывшие. Война в академии магии

Берг Александра
2. Измены
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Бывшие. Война в академии магии

Мастер клинков. Начало пути

Распопов Дмитрий Викторович
1. Мастер клинков
Фантастика:
фэнтези
9.16
рейтинг книги
Мастер клинков. Начало пути

Имя нам Легион. Том 8

Дорничев Дмитрий
8. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 8

Измена. Право на счастье

Вирго Софи
1. Чем закончится измена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на счастье

Начальник милиции 2

Дамиров Рафаэль
2. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции 2

Камень. Книга 4

Минин Станислав
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Камень. Книга 4

Измена. Мой заклятый дракон

Марлин Юлия
Любовные романы:
любовно-фантастические романы
7.50
рейтинг книги
Измена. Мой заклятый дракон

Предатель. Цена ошибки

Кучер Ая
Измена
Любовные романы:
современные любовные романы
5.75
рейтинг книги
Предатель. Цена ошибки

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Рождение победителя

Каменистый Артем
3. Девятый
Фантастика:
фэнтези
альтернативная история
9.07
рейтинг книги
Рождение победителя

Барону наплевать на правила

Ренгач Евгений
7. Закон сильного
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Барону наплевать на правила

Камень. Книга шестая

Минин Станислав
6. Камень
Фантастика:
боевая фантастика
7.64
рейтинг книги
Камень. Книга шестая

Чужая дочь

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужая дочь