Страница 125 из 502
Перегрузка логических операторов
Как вам должно быть уже известно, в C# предусмотрены следующие логические операторы: &, |, !, && и ||. Из них перегрузке, безусловно, подлежат только операторы &, | и !. Тем не менее, соблюдая определенные правила, можно извлечь также пользу из укороченных логических операторов && и ||. Все эти возможности рассматриваются ниже.
Рассмотрим сначала простейший случай. Если не пользоваться укороченными логическими операторами, то перегрузку операторов & и | можно выполнять совершенно естественным путем, получая в каждом случае результат типа bool. Аналогичный результат, как правило, дает и перегружаемый оператор !.
Ниже приведен пример программы, в которой демонстрируется перегрузка логических операторов !, & и | для объектов типа ThreeD. Как и в предыдущем примере, объект типа ThreeD считается истинным, если хотя бы одна из его координат не равна нулю. Если же все три координаты объекта равны нулю, то он считается ложным.
<b>// Простой способ перегрyзки логическиx операторов </b>
<b>// !, | и & для объектов класса 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зить логический оператор &.</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зить логический оператор !. </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 + ", " + y + ", " + 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("Координаты точки a: ");</b>
<b> a.Show();</b>
<b> Console.Write("Координаты точки b: ");</b>
<b> b.Show();</b>
<b> Console.Write("Координаты точки с: ");</b>
<b> c.Show();</b>
<b> Console.WriteLine();</b>
<b> if (!a) Console.WriteLine("Точка а ложна.");</b>
<b> if (!b) Console.WriteLine("Точка b ложна.");</b>
<b> if (!c) Console.WriteLine("Точка с ложна.");</b>
<b> if (a & b) Console.WriteLine("a & b истинно.");</b>
<b> else Console.WriteLine("a & b ложно.");</b>
<b> if (a & c) Console.WriteLine("a & с истинно.");</b>
<b> else Console.WriteLine("a & с ложно.");</b>
<b> if (a | b) Console.WriteLine("a | b истинно.");</b>
<b> else Console.WriteLine("a | b ложно.");</b>