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

Страница 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(&quot;Координаты точки a: &quot;);</b>

<b>    a.Show();</b>

<b>    Console.WriteLine();</b>

<b>    Console.Write(&quot;Координаты точки b: &quot;);</b>

<b>    b.Show();</b>

<b>    Console.WriteLine();</b>

<b>    c = a + b; // сложить объекты класса ThreeD </b>

<b>    Console.Write(&quot;Результат сложения a + b: &quot;);</b>

<b>    c.Show();</b>

<b>    Console.WriteLine();</b>

<b>    c = b + 10; // сложить объект типа ThreeD и целое значение типа int </b>

<b>    Console.Write(&quot;Результат сложения b + 10: &quot;);</b>

<b>    c.Show();</b>

<b>    Console.WriteLine();</b>

<b>    c = 15 + b; // сложить целое значение типа int и объект типа ThreeD </b>

<b>    Console.Write(&quot;Результат сложения 15 + b: &quot;);</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>// Перегрузить операторы &lt; и &gt;. </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>  // Перегрузить оператор &lt;.</b>

<b>  public static bool operator &lt;(ThreeD op1, ThreeD op2) {</b>

<b>    if (Math.Sqrt(op1.x * op1.x + op1.y * op1.y + op1.z * op1.z) &lt;</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>  // Перегрузить оператор &gt;.</b>

<b>  public static bool operator &gt;(ThreeD op1, ThreeD op2) {</b>

<b>    if (Math.Sqrt(op1.x * op1.x + op1.y * op1.y + op1.z * op1.z) &gt;</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 + &quot;, &quot; + y + &quot;, &quot; + z) ;</b>

<b>  }</b>

<b>}</b>