Существуют две формы операторных методов (operator): одна — для унарных операторов, другая — для бинарных. Ниже приведена общая форма для каждой раз новидности этих методов. // Общая форма перегрузки унарного оператора. public static возвращаемый_тип operator op(тип_параметра операнд) { // операции } // Общая форма перегрузки бинарного оператора. public static возвращаемый_тип operator op(тип_параметра1 операнд1, тип_параметра1 операнд2) { // операции }
Здесь вместо ор подставляется перегружаемый оператор, например + или /; а воз вращаемый_тип обозначает конкретный тип значения, возвращаемого указанной опе рацией. Это значение может быть любого типа, но зачастую оно указывается такого же типа, как и у класса, для которого перегружается оператор. Такая корреляция упро щает применение перегружаемых операторов в выражениях. Для унарных операторов операнд обозначает передаваемый операнд, а для бинарных операторов то же самое обозначают операнд1 и операнд2. Обратите внимание на то, что операторные мето ды должны иметь оба типа, public и static.
Тип операнда унарных операторов должен быть таким же, как и у класса, для ко торого перегружается оператор. А в бинарных операторах хотя бы один из операндов должен быть такого же типа, как и у его класса. Следовательно, в C# не допускается перегрузка любых операторов для объектов, которые еще не были созданы. Например, назначение оператора + нельзя переопределить для элементов типа int или string. И еще одно замечание: в параметрах оператора нельзя использовать модификатор ref или out. Перегрузка бинарных операторов
Для того чтобы продемонстрировать принцип действия перегрузки операторов, начнем с простого примера, в котором перегружаются два оператора — + и -. В при веденной ниже программе создается класс ThreeD, содержащий координаты объекта в трехмерном пространстве. Перегружаемый оператор + складывает отдельные коор динаты одного объекта типа ThreeD с координатами другого. А перегружаемый опе ратор - вычитает координаты одного объекта из координат другого. // Пример перегрузки бинарных операторов. using System; // Класс для хранения трехмерных координат. class ThreeD { int х, у, z; // трехмерные координаты public ThreeD { х = у = z = 0; } public ThreeD(int i, int j, int k) { x = i; у = j; z = k; } // Перегрузить бинарный оператор +. public static ThreeD operator +(ThreeD op1, ThreeD op2) { ThreeD result = new ThreeD; /* Сложить координаты двух точек и возвратить результат. */ result.х = op1.x + ор2.х; // Эти операторы выполняют result.у = op1.y + ор2.у; // целочисленное сложение, result.z = op1.z + op2.z; // сохраняя свое исходное назначение. return result; } // Перегрузить бинарный оператор -. public static ThreeD operator -(ThreeD op1, ThreeD op2) { ThreeD result = new ThreeD; /* Обратите внимание на порядок следования операндов: op1 — левый операнд, а ор2 — правый операнд. */ result.х = op1.x - ор2.х; // Эти операторы result.у = op1.y - ор2.у; // выполняют целочисленное result.z = op1.z - op2.z; // вычитание return result; } // Вывести координаты X, Y, Z. public void Show { Console.WriteLine(x + ", " + у + ", " + z); } } class ThreeDDemo { static void Main { ThreeD a = new ThreeD(1, 2, 3); ThreeD b = new ThreeD(10, 10, 10); ThreeD c; Console.Write("Координаты точки a: "); a.Show; Console.WriteLine; Console.Write("Координаты точки b: "); b.Show; Console.WriteLine; с = а + b; // сложить координаты точек а и b Console.Write("Результат сложения а + b: "); с.Show; Console.WriteLine; с = а + b + с; // сложить координаты точек а, b и с Console.Write("Результат сложения а + b + с: "); с.Show; Console.WriteLine; с = с - а; // вычесть координаты точки а Console.Write("Результат вычитания с - а: "); с.Show; Console.WriteLine; с = с - b; // вычесть координаты точки b Console.Write("Результат вычитания с - b: "); с.Show; Console.WriteLine; } }
При выполнении этой программы получается следующий результат. Координаты точки а: 1, 2, 3 Координаты точки b: 10, 10, 10 Результат сложения а + b: 11, 12, 13 Результат сложения а + b + с: 22, 24, 26 Результат вычитания с - а: 21, 22, 23 Результат вычитания с - b: 11, 12, 13