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

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

    Операторов сравнения всего шесть, и, как отмечалось в предыдущих шагах, перегружаются они парами. Правила такие:

    В своих "оригинальных" версиях операторы сравнения возвращают результатом значения логического тина. Обычно операторы сравнения для объектов пользовательских классов перегружаются так, чтобы результат был логического типа. Но это не есть обязательное условие перегрузки операторов сравнения. В принципе, результат операторного метода для операторов сравнения может быть любого типа, не обязательно логического.

    Также важно понимать, что подразумевается под "парной" перегрузкой операторов сравнения. Дело в том, что для одного и того же оператора может быть описано несколько версий операторного метода, которые отличаются типом аргументов и/или типом результата. То, что операторы сравнения перегружаются парами, означает, что если описана версия операторного метода для оператора сравнения с аргументами и результатом определенного типа, то должна быть описана версия операторного метода для другого оператора из пары с аргументами и результатом такого же типа. Например, если мы описали в классе операторный метод для оператора >= с результатом логического типа и аргументами, которые оба являются объектами класса, то в классе должен быть описан и операторный метод для оператора <= с результатом логического типа и аргументами, которые являются объектами класса.

    Небольшой пример перегрузки операторов сравнения <= и >= представлен ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr109_1
{
    class Program
    {
        // Класс с перегрузкой операторов сравнения: 
        class MyClass {
            // Символьное поле: 
            public char symb;
            // Конструктор с одним аргументом: 
            public MyClass(char s){
                // Присваивание значения полю: 
                symb=s;
            }

            // Перегрузка оператора "меньше или равно": 
            public static bool operator<=(MyClass a, MyClass b) { 
                if (a.symb <= b.symb) return true; 
                else return false;
            }

            // Перегрузка оператора "больше или равно": 
            public static bool operator>=(MyClass a, MyClass b){ 
                if(a.symb >= b.symb) return true; 
                else return false;
            }
        }

        // Класс с главным методом: 
        static void Main()
        {
            // Создание объектов:
            MyClass A = new MyClass('A');
            MyClass B = new MyClass('B');
            MyClass C = new MyClass('A');
            // Использование операторов сравнения:
            Console.WriteLine("A<=B дает {0}", A <= B);
            Console.WriteLine("A>=B дает {0}", A >= B);
            Console.WriteLine("A<=C дает {0}", A <= C);
            Console.WriteLine("A>=C дает {0}", A >= C);
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

    Результат выполнения программы такой.


Рис.1. Результат выполнения программы

   

    Мы в программе описали класс MyClass с символьным полем symb, конструктором с одним аргументом, а еще в классе описаны два операторных метода для операторов <= и >=. Подразумевается, что с помощью операторов сравниваются объекты класса MyClass. Методы возвращают логическое значение true или false в зависимости от результатов сравнения значений символьных полей объектов. В главном методе создаются три объекта, и для их сравнения используются операторы >= и <=. Ситуация достаточно простая. Поэтому хочется верить, что более подробных пояснений код программы и результат ее выполнения не требуют.

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




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