Перегрузка операторов (операций). Перегрузка бинарных (арифметических) операций. Перегрузка унарных операций и операций отношений.
Перегрузка бинарных операций
C# позволяет определить значение операции (арифметической, логической, …) относительно создаваемого класса. Этот процесс называется перегрузкой операторов. Перегрузка операторов расширяет функциональность класса. Например: можно перегрузить операцию «+» для класса Num_Array: это означает слияние массивов в общий, результирующий массив. Операция «+» для класса Point будет означать суммирование соответствующий координат двух точек. Операция «+» для класса Stack будет означать слияние стеков, то есть получение общего, результирующего стека.
Перегрузку оператора расценивают как введение новой операции для класса, если она имеет смысл. Тогда можно оперировать объектами (составлять выражения над объектами), используя обычный синтаксис выражений. Более того, в выражениях можно использовать объекты и другие типы данных (например: Point и int), но для этого нужно перегрузить ещё раз соответствующую операцию. Перегрузка операторов – одно из самых мощных средств языка C#. Перегрузка операторов тесно связана с перегрузкой методов, то есть они похожи.
Для перегрузки операторов используется ключевое слово operator, позволяющее создать операторный метод, который определяет действие оператора, связанное с его классом.
Существует две формы операторных методов: для бинарных операций и для унарных операций.
Общий формат перегрузки бинарного оператора:
public static Тип_возврата operator знак_операции(тип и имя операнда_1, тип и имя операнда_2)
{
//Операторы
}
Здесь знак_операции – это оператор “+”, “-”, “=”, “ = = ” и т.д.; операнд_1– это левый операнд, а операнд2 – это правый операнд, например:
Ob3 = Ob1 – Ob2;
левый правый
Перегрузку оператора рассмотрим на примере класса Point:
//В классе Point:
public static Point operator + (Point Ob1, Point Ob2)
{
return new Point(Ob1.x + Ob2.x, Ob1.y + Ob2.y);
}
//В Main():
Point T1 = new Point(5, 23);
Point T2 = new Point(17, 8);
Point T3 = T1 + T2;
T3.Show();
//Выполнить!
Задание: Аналогично разработать операторный метод « - » (минус) для точек.
//В классе Point:
Public static Point operator - (Point Ob1, Point Ob2)
{
return new Point(Ob1.x - Ob2.x, Ob1.y - Ob2.y);
}
//Выполнить!
Примечание: Подавляющее большинство языков программирования (VB, Java) не поддерживают перегрузку операторов. Требования обеспечить перегрузку операторов нет и в CLS (Common Languages Specification). Если в один проект собрать модули, написанные на разных языках программирования (компонентно-ориентированное программирование), то перегрузка операторов может не работать. Выход: каждому перегруженному оператору создать аналогичный обычный метод.
//В классе Point:
Public static Point AddPoint(Point Ob1, Point Ob2)
{
return new Point(Ob1.x + Ob2.x, Ob1.y + Ob2.y);
}
Чтобы не дублировать программный код, ещё проще передавать вызовы от перегруженного оператора «+» обычному методу. Изменим операторный метод «+» в классе Point.
public static Point operator +(Point Ob1, Point Ob2)
{
return AddPoint(Ob1,Ob2);
}
//Выполнить!
Перегрузка унарных операций и операций отношений
Унарная операция означает, что в ней участвует один операнд. Примеры унарных операций: изменение значения числовой переменной на противоположную (-); инкрементирование (++) и декрементирование (--) и др.
Формат записи унарного оператора:
public static Тип_возврата operator знак_операции (тип и имя операнда)
{
// Операторы
}