Добавить в цитаты Настройки чтения

Страница 59 из 188

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); }}

class ThreeDDemo { static void Main() { ThreeD a = new ThreeD(5, 6, 7); ThreeD b = new ThreeD(10, 10, 10); ThreeD с = new ThreeD(1, 2, 3); ThreeD d = new ThreeD(6, 7, 5); Console.Write("Координаты точки a: "); a.Show(); Console.Write("Координаты точки b: "); b.Show(); Console.Write("Координаты точки с: "); c.Show(); Console.Write("Координаты точки d: "); d.Show(); Console.WriteLine(); if(а > с) Console.WriteLine("а > с истинно"); if(а < с) Console.WriteLine("а < с истинно"); if(а > b) Console.WriteLine("а > b истинно"); if(а < b) Console.WriteLine("а < b истинно"); if(а > d) Console.WriteLine("а > d истинно"); else if(а < d) Console.WriteLine("a < d истинно"); else Console.WriteLine("Точки a и d находятся на одном расстоянии " + "от начала отсчета");}

}Вот к какому результату приводит выполнение этого кода.

Координаты точки а: 5, 6, 7Координаты точки b: 10, 10, 10Координаты точки с: 1, 2, 3Координаты точки d: 6, 7, 5а > с истинноа < b истинноТочки a и d находятся на одном расстоянии от начала отсчетаНа перегрузку операторов отношения накладывается следующее важное ограничение: они должны перегружаться попарно. Так, если перегружается оператор <, тоследует перегрузить и оператор >, и наоборот. Ниже приведены составленные в парыперегружаемые операторы отношения.==!=<><=>=