Шаг 110.
Язык программирования C#. Начала
Перегрузка операторов. Перегрузка операторов сравнения (продолжение)

    На этом шаге мы рассмотрим более сложный пример, связанный с перегрузкой операторов.

    Еще один пример, более сложный, связанный с перегрузкой операторов сравнения (на этот раз перегружаются операторы <, <=, > и >=), представлен в примере ниже. Там, кроме прочего, встречается ситуация, когда оператор сравнения результатом возвращает значение, тип которого отличается от логического.

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 в зависимости от значений полей сравниваемых объектов.


Логические значения true и false при выводе в консольное окно отображаются с большой буквы.

    Мы объявляем объектную переменную С класса MyClass. При выполнении команды

  C = A >= B;
в переменную С записывается ссылка на тот же объект, на который ссылается переменная В. Поэтому когда выполняется команда
  C.code = 300;   ,
то в действительности значение присваивается полю code объекта В. А вот при выполнении команды
  C = A <= B;
в переменную С записывается ссылка на объект А. Командой
  C.code = 150;
присваивается новое значение полю code объекта А.

    Значением выражения В<=А является ссылка на объект А. Поэтому команда

  (B <= A).code = 500;
означает, что полю code объекта А присваивается значение 500.

    Также мы используем три целочисленные переменные х, у и z со значениями 400, 500 и 600 соответственно. Эти переменные сравниваются с объектом А. Использование для сравнения операторов <= и >= дает в результате логическое значение. Достоин внимания результат сравнения объекта А с переменной у (команды А<=у и А>=у). Здесь имеет место ситуация, упомянутая ранее: значение поля code объекта А и значение переменной у совпадают. Поэтому оба выражения А<=у и А>=у значением дают false.

    Сравнение объекта А с целочисленными переменными с помощью операторов > и < (команды A<z и А>х) результатом дает целое число (для оператора > это разность поля code объекта и числа, а для оператора < это разность числа и поля code объекта).

    На следующем шаге мы продолжим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг