Страница 120 из 502
<b>Установка исходных координат точки а: 1, <i>2,</i> 3 </b>
<b>Если с = ++а </b>
<b>то координаты точки с равны <i>2,</i> 3, 4 </b>
<b>а координаты точки а равны <i>2,</i> 3, 4</b>
Выполнение операций со встроенными в C# типами данных
Для любого заданного класса и оператора имеется также возможность перегрузить сам операторный метод. Это, в частности, требуется для того, чтобы разрешить операции с типом класса и другими типами данных, в том числе и встроенными. Вновь обратимся к классу ThreeD. На примере этого класса ранее было показано, как оператор + перегружается для сложения координат одного объекта типа ThreeD с координатами другого. Но это далеко не единственный способ определения операции сложения для класса ThreeD. Так, было бы не менее полезно прибавить целое значение к каждой координате объекта типа ThreeD. Подобная операция пригодилась бы для переноса осей координат. Но для ее выполнения придется перегрузить оператор + еще раз, как показано ниже.
<b>// Перегрузить бинарный оператор + для сложения объекта</b>
<b>// типа ThreeD и целого значения типа int.</b>
<b>public static ThreeD operator +(ThreeD op1, int op2)</b>
<b>{</b>
<b> ThreeD result = new ThreeD(); </b>
<b> result.x = op1.x + op2; </b>
<b> result.у = op1.y + op2; </b>
<b> result.z = op1.z + op2;</b>
<b> return result;</b>
<b>}</b>
Как видите, второй параметр операторного метода имеет тип int. Следовательно, в этом методе разрешается сложение целого значения с каждым полем объекта типа ThreeD. Такая операция вполне допустима, потому что, как пояснялось выше, при перегрузке бинарного оператора один из его операндов должен быть того же типа, что и класс, для которого этот оператор перегружается. Но у второго операнда этого оператора может быть любой другой тип.
Ниже приведен вариант класса ThreeD с двумя перегружаемыми методами оператора +.
<b>// Перегрузить бинарный оператор + дважды:</b>
<b>// один раз — для сложения объектов класса ThreeD,</b>
<b>// а другой раз — для сложения объекта типа ThreeD и целого значения типа int. </b>
<b>using System;</b>
<b>// Класс для хранения трехмерных координат, </b>
<b>class ThreeD {</b>
<b> int x, y, z; // трехмерные координаты</b>
<b> public ThreeD() { x = y = z = 0; }</b>
<b> public ThreeD(int i, int j, int k) {</b>
<b> x = i;</b>
<b> y = j;</b>
<b> z = k;</b>
<b> }</b>
<b> // Перегрузить бинарный оператор +.</b>
<b> public static ThreeD operator +(ThreeD op1, ThreeD op2) {</b>
<b> ThreeD result = new ThreeD();</b>
<b> /* Сложить координаты двух точек и возвратить результат. */</b>
<b> result.x = op1.x + op2.x;</b>
<b> result.y = op1.y + op2.y;</b>
<b> result.z = op1.z + op2.z;</b>
<b> return result;</b>
<b> }</b>
<b> // Перегрузить бинарный оператор + для сложения </b>
<b> // объекта типа ThreeD и целого значения типа int. </b>
<b> public static ThreeD operator +(ThreeD op1, int op2) {</b>
<b> ThreeD result = new ThreeD();</b>
<b> result.x = op1.x + op2;</b>
<b> result.y = op1.y + op2;</b>
<b> result.z = op1.z + op2;</b>
<b> return result;</b>
<b> }</b>
<b> // Вывести координаты X, Y, Z. </b>
<b> public void Show() {</b>
<b> Console.WriteLine(x + ", " + y + ", " + z);</b>
<b> }</b>
<b>}</b>
<b>class ThreeDDemo {</b>
<b> static void Main() {</b>
<b> ThreeD a = new ThreeD(1, 2, 3);</b>
<b> ThreeD b = new ThreeD(10, 10, 10);</b>
<b> ThreeD c = new ThreeD();</b>
<b> Console.Write("Координаты точки a: ");</b>
<b> a.Show();</b>
<b> Console.WriteLine();</b>
<b> Console.Write("Координаты точки b: ");</b>
<b> b.Show();</b>