На этом шаге мы рассмотрим более сложный пример, связанный с перегрузкой операторов.
Еще один пример, более сложный, связанный с перегрузкой операторов сравнения (на этот раз перегружаются операторы <, <=, > и >=), представлен в примере ниже. Там, кроме прочего, встречается ситуация, когда оператор сравнения результатом возвращает значение, тип которого отличается от логического.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr110_1 { class Program { // Класс с перегруженными операторами сравнения: class MyClass { // Целочисленное поле: public int code; // Конструктор с одним аргументом: public MyClass(int n) { // Присваивание значения полю: code = n; } // Перегрузка оператора "меньше или равно": public static MyClass operator <=(MyClass a, MyClass b) { if (a.code <= b.code) return a; else return b; } // Перегрузка оператора "больше или равно": public static MyClass operator >=(MyClass a, MyClass b) { if (a.code >= b.code) return a; else return b; } // Перегрузка оператора "меньше или равно": public static bool operator <=(MyClass a, int x) { if (a.code <= x - 1) return true; else return false; } // Перегрузка оператора "больше или равно": public static bool operator >=(MyClass a, int x) { if (a.code >= x + 1) return true; else return false; } // Перегрузка оператора "меньше": public static bool operator <(MyClass a, MyClass b) { return a.code < b.code; } // Перегрузка оператора "больше": public static bool operator >(MyClass a, MyClass b) { return a.code > b.code; } // Перегрузка оператора "меньше": public static int operator <(MyClass a, int x) { return x - a.code; } // Перегрузка оператора "больше": public static int operator >(MyClass a, int x) { return a.code - x; } } // Класс с главным методом: static void Main() { // Создание объектов: MyClass A = new MyClass(100); MyClass B = new MyClass(200); // Проверка результата: Console.WriteLine("Объект A: {0}", A.code); Console.WriteLine("Объект В: {0}", B.code); // Использование операторов "меньше" и "больше": Console.WriteLine("А<В дает {0}", A < B); Console.WriteLine("А>В дает {0}", A > B); // Объектная переменная: MyClass C; // Использование оператора "больше или равно": C = A >= B; // Новое значение поля: C.code = 300; // Проверка результата: Console.WriteLine("Объект В: {0}", B.code); // Использование оператора "меньше или равно": C = A <= B; // Новое значение поля: C.code = 150; // Проверка результата: Console.WriteLine("Объект A: {0}", A.code); // Новое значение поля: (B <= A).code = 500; // Проверка результата: Console.WriteLine("Объект A: {0}", A.code); // Целочисленные переменные: int x = 400, y = 500, z = 600; // Использование операторов "меньше или равно" и // "больше или равно": Console.WriteLine("А<={0} дает {1}", x, A <= x); Console.WriteLine("А>={0} дает {1}", x, A >= x); Console.WriteLine("А<={0} дает {1}", y, A <= y); Console.WriteLine("А>={0} дает {1}", y, A >= y); Console.WriteLine("А<={0} дает {1}", z, A <= z); Console.WriteLine("А>={0} дает {1}", z, A >= z); // Использование операторов "меньше" и "больше": Console.WriteLine("А<{0} дает {1}", z, A < z); Console.WriteLine("А>{0} дает {1}", x, A > x); // Задержка: Console.ReadLine(); } } }
На этот раз при выполнении программы получаем следующее.
Рис.1. Результат выполнения программы
Операторные методы перегружаются для класса МуСlass. У класса есть целочисленное поле code и конструктор с одним аргументом (значение поля). В классе перегружаются такие операторы:
В главном методе программы мы проверяем функциональность перегруженных операторов. Для этого создаем два объекта А и В класса MyClass со значениями полей 100 и 200 соответственно. Затем выполняются различные операции с использованием операторов <, >, <= и >=. При вычислении выражений А<В и А>В результатом является true и false в зависимости от значений полей сравниваемых объектов.
Мы объявляем объектную переменную С класса MyClass. При выполнении команды
C = A >= B;
C.code = 300; ,
C = A <= B;
C.code = 150;
Значением выражения В<=А является ссылка на объект А. Поэтому команда
(B <= A).code = 500;
Также мы используем три целочисленные переменные х, у и z со значениями 400, 500 и 600 соответственно. Эти переменные сравниваются с объектом А. Использование для сравнения операторов <= и >= дает в результате логическое значение. Достоин внимания результат сравнения объекта А с переменной у (команды А<=у и А>=у). Здесь имеет место ситуация, упомянутая ранее: значение поля code объекта А и значение переменной у совпадают. Поэтому оба выражения А<=у и А>=у значением дают false.
Сравнение объекта А с целочисленными переменными с помощью операторов > и < (команды A<z и А>х) результатом дает целое число (для оператора > это разность поля code объекта и числа, а для оператора < это разность числа и поля code объекта).
На следующем шаге мы продолжим изучение этого вопроса.