Страница 122 из 502
<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>
<b> Console.WriteLine();</b>
<b> c = a + b; // сложить объекты класса ThreeD </b>
<b> Console.Write("Результат сложения a + b: ");</b>
<b> c.Show();</b>
<b> Console.WriteLine();</b>
<b> c = b + 10; // сложить объект типа ThreeD и целое значение типа int </b>
<b> Console.Write("Результат сложения b + 10: ");</b>
<b> c.Show();</b>
<b> Console.WriteLine();</b>
<b> c = 15 + b; // сложить целое значение типа int и объект типа ThreeD </b>
<b> Console.Write("Результат сложения 15 + b: ");</b>
<b> c.Show();</b>
<b> }</b>
<b>}</b>
Выполнение этого кода дает следующий результат.
<b>Координаты точки а: 1, 2, 3</b>
<b>Координаты точки b: 10, 10, 10 </b>
<b>Результат сложения а + b: 11, 12, 13 </b>
<b>Результат сложения b + 10: 20, 20, 20 </b>
<b>Результат сложения 15 + b: 25, 25, 25</b>
Перегрузка операторов отношения
Операторы отношения, например == и <, могут также перегружаться, причем очень просто. Как правило, перегруженный оператор отношения возвращает логическое значение true и false. Это вполне соответствует правилам обычного применения подобных операторов и дает возможность использовать их перегружаемые разновидности в условных выражениях. Если же возвращается результат другого типа, то тем самым сильно ограничивается применимость операторов отношения.
Ниже приведен очередной вариант класса ThreeD, в котором перегружаются операторы < и >. В данном примере эти операторы служат для сравнения объектов ThreeD, исходя из их расстояния до начала координат. Один объект считается больше другого, если он находится дальше от начала координат. А кроме того, один объект считается меньше другого, если он находится ближе к началу координат. Такой вариант реализации позволяет, в частности, определить, какая из двух заданных точек находится на большей сфере. Если же ни один из операторов не возвращает логическое значение true, то обе точки находятся на одной и той же сфере. Разумеется, возможны и другие алгоритмы упорядочения.
<b>// Перегрузить операторы < и >. </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) { x = i; y = j; z = k; }</b>
<b> // Перегрузить оператор <.</b>
<b> public static bool operator <(ThreeD op1, ThreeD op2) {</b>
<b> if (Math.Sqrt(op1.x * op1.x + op1.y * op1.y + op1.z * op1.z) <</b>
<b> Math.Sqrt(op2.x * op2.x + op2.y * op2.y + op2.z * op2.z))</b>
<b> return true;</b>
<b> else</b>
<b> return false;</b>
<b> }</b>
<b> // Перегрузить оператор >.</b>
<b> public static bool operator >(ThreeD op1, ThreeD op2) {</b>
<b> if (Math.Sqrt(op1.x * op1.x + op1.y * op1.y + op1.z * op1.z) ></b>
<b> Math.Sqrt(op2.x * op2.x + op2.y * op2.y + op2.z * op2.z))</b>
<b> return true;</b>
<b> else</b>
<b> return false;</b>
<b> }</b>
<b> // Вывести координаты X, Y, Z. </b>
<b> public void Show() {</b>
<b> Console.WriteLine(x + ", " + y + ", " + z) ;</b>
<b> }</b>
<b>}</b>