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

Страница 125 из 502

Перегрузка логических операторов

Как вам должно быть уже известно, в C# предусмотрены следующие логические операторы: &, |, !, && и ||. Из них перегрузке, безусловно, подлежат только операторы &, | и !. Тем не менее, соблюдая определенные правила, можно извлечь также пользу из укороченных логических операторов && и ||. Все эти возможности рассматриваются ниже.

Рассмотрим сначала простейший случай. Если не пользоваться укороченными логическими операторами, то перегрузку операторов & и | можно выполнять совершенно естественным путем, получая в каждом случае результат типа bool. Аналогичный результат, как правило, дает и перегружаемый оператор !.

Ниже приведен пример программы, в которой демонстрируется перегрузка логических операторов !, & и | для объектов типа ThreeD. Как и в предыдущем примере, объект типа ThreeD считается истинным, если хотя бы одна из его координат не равна нулю. Если же все три координаты объекта равны нулю, то он считается ложным.

<b>// Простой способ перегрyзки логическиx операторов </b>

<b>// !, | и &amp; для объектов класса ThreeD.</b>

<b>using System;</b>

<b>// Класс для xранения треxмерныx координат. </b>

<b>class ThreeD {</b>

<b>  int x, y, z; // треxмерные координаты</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>  // Перегрyзить логический оператор |.</b>

<b>  public static bool operator |(ThreeD op1, ThreeD op2) {</b>

<b>    if (((op1.x != 0) || (op1.y != 0) || (op1.z != 0)) |</b>

<b>       ((op2.x != 0) || (op2.y != 0) || (op2.z != 0)))</b>

<b>      return true;</b>

<b>    else</b>

<b>      return false;</b>

<b>  }</b>

<b>  // Перегрyзить логический оператор &amp;.</b>

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

<b>    if (((op1.x != 0) &amp;&amp; (op1.y != 0) &amp;&amp; (op1.z != 0)) &amp;</b>

<b>       ((op2.x != 0) &amp;&amp; (op2.y != 0) &amp;&amp; (op2.z != 0)))</b>

<b>      return true;</b>

<b>    else</b>

<b>      return false;</b>

<b>  }</b>

<b>  // Перегрyзить логический оператор !. </b>

<b>  public static bool operator !(ThreeD op) {</b>

<b>    if ((op.x != 0) || (op.y != 0) || (op.z != 0))</b>

<b>      return false;</b>

<b>    else</b>

<b>      return true;</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>

<b>class TrueFalseDemo {</b>

<b>  static void Main() {</b>

<b>    ThreeD a = new ThreeD(5, 6, 7);</b>

<b>    ThreeD b = new ThreeD(10, 10, 10);</b>

<b>    ThreeD c = new ThreeD(0, 0, 0);</b>

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

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

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

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

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

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

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

<b>    if (!a) Console.WriteLine(&quot;Точка а ложна.&quot;);</b>

<b>    if (!b) Console.WriteLine(&quot;Точка b ложна.&quot;);</b>

<b>    if (!c) Console.WriteLine(&quot;Точка с ложна.&quot;);</b>

<b>    if (a &amp; b) Console.WriteLine(&quot;a &amp; b истинно.&quot;);</b>

<b>    else Console.WriteLine(&quot;a &amp; b ложно.&quot;);</b>

<b>    if (a &amp; c) Console.WriteLine(&quot;a &amp; с истинно.&quot;);</b>

<b>    else Console.WriteLine(&quot;a &amp; с ложно.&quot;);</b>

<b>    if (a | b) Console.WriteLine(&quot;a | b истинно.&quot;);</b>

<b>    else Console.WriteLine(&quot;a | b ложно.&quot;);</b>