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

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

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

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

<b>  }</b>

<b>}</b>

При выполнении этой программы получается следующий результат.

<b>Координаты точки а: 5, 6, 1</b>

<b>Координаты точки b: 10, 10,    10</b>

<b>Координаты точки с: 0, 0, 0</b>

<b>Точка с ложна.</b>

<b>а &amp; b истинно.</b>

<b>а &amp; с ложно. </b>

<b>а | b истинно, </b>

<b>а | с истинно.</b>

При таком способе перегрузки логических операторов &, | и ! методы каждого из них возвращают результат типа bool. Это необходимо для того, чтобы использовать рассматриваемые операторы обычным образом, т.е. в тех выражениях, где предполагается результат типа bool. Напомним, что для всех встроенных в C# типов данных результатом логической операции должно быть значение типа bool. Поэтому вполне разумно предусмотреть возврат значения типа bool и в перегружаемых вариантах этих логических операторов. Но, к сожалению, такой способ перегрузки пригоден лишь в том случае, если не требуются укороченные логические операторы.

Для того чтобы применение укороченных логических операторов &amp;&amp; и || стало возможным, необходимо соблюсти следующие четыре правила. Во-первых, в классе должна быть произведена перегрузка логических операторов &amp; и |. Во-вторых, перегружаемые методы операторов &amp; и | должны возвращать значение того же типа, что и у класса, для которого эти операторы перегружаются. В-третьих, каждый параметр должен содержать ссылку на объект того класса, для которого перегружается логический оператор. И в-четвертых, для класса должны быть перегружены операторы true и false. Если все эти условия выполняются, то укороченные логические операторы автоматически становятся пригодными для применения.

В приведенном ниже примере программы показано, как правильно реализовать логические операторы &amp; и | в классе ThreeD, чтобы сделать доступными для применения укороченные логические операторы &amp;&amp; и ||.

<b>/* Более совершенный способ перегрyзки логическиx оперaторов !,  | и &amp; для объектов клaссa ThreeD.</b>

<b>В этом вaриaнте yкороченные логические оперaторы &amp;&amp; и || стaновятся достyпными для применения aвтомaтически. */</b>

<b>using System;</b>

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

<b>class ThreeD {</b>

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

<b>  public static ThreeD 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 new ThreeD(1, 1, 1);</b>

<b>    else</b>

<b>      return new ThreeD(0, 0, 0);</b>

<b>  }</b>

<b>  // Перегрyзить логический оперaтор &amp; для yкороченного вычисления, </b>

<b>  public static ThreeD 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 new ThreeD(1, 1, 1);</b>

<b>    else</b>

<b>      return new ThreeD(0, 0, 0);</b>

<b>  }</b>

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

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

<b>    if (op)</b>

<b>      return false;</b>

<b>    else</b>

<b>      return true;</b>

<b>  }</b>

<b>  // Перегрyзить оперaтор true.</b>

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

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

<b>      return true;    //xотя бы однa координaтa не рaвнa нyлю</b>

<b>    else</b>

<b>      return false;</b>

<b>  }</b>