Страница 126 из 502
<b> if (a | c) Console.WriteLine("a | с истинно.");</b>
<b> else Console.WriteLine("a | с ложно.");</b>
<b> }</b>
<b>}</b>
При выполнении этой программы получается следующий результат.
<b>Координаты точки а: 5, 6, 1</b>
<b>Координаты точки b: 10, 10, 10</b>
<b>Координаты точки с: 0, 0, 0</b>
<b>Точка с ложна.</b>
<b>а & b истинно.</b>
<b>а & с ложно. </b>
<b>а | b истинно, </b>
<b>а | с истинно.</b>
При таком способе перегрузки логических операторов &, | и ! методы каждого из них возвращают результат типа bool. Это необходимо для того, чтобы использовать рассматриваемые операторы обычным образом, т.е. в тех выражениях, где предполагается результат типа bool. Напомним, что для всех встроенных в C# типов данных результатом логической операции должно быть значение типа bool. Поэтому вполне разумно предусмотреть возврат значения типа bool и в перегружаемых вариантах этих логических операторов. Но, к сожалению, такой способ перегрузки пригоден лишь в том случае, если не требуются укороченные логические операторы.
Для того чтобы применение укороченных логических операторов && и || стало возможным, необходимо соблюсти следующие четыре правила. Во-первых, в классе должна быть произведена перегрузка логических операторов & и |. Во-вторых, перегружаемые методы операторов & и | должны возвращать значение того же типа, что и у класса, для которого эти операторы перегружаются. В-третьих, каждый параметр должен содержать ссылку на объект того класса, для которого перегружается логический оператор. И в-четвертых, для класса должны быть перегружены операторы true и false. Если все эти условия выполняются, то укороченные логические операторы автоматически становятся пригодными для применения.
В приведенном ниже примере программы показано, как правильно реализовать логические операторы & и | в классе ThreeD, чтобы сделать доступными для применения укороченные логические операторы && и ||.
<b>/* Более совершенный способ перегрyзки логическиx оперaторов !, | и & для объектов клaссa ThreeD.</b>
<b>В этом вaриaнте yкороченные логические оперaторы && и || ст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тор & для 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тор !. </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>