В языке C# допускается определять назначение оператора по отношению к создаваемому классу. Этот процесс называется
Когда оператор перегружается, ни одно из его первоначальных назначений не теряется. Он просто выполняет еще одну, новую операцию относительно конкретного объекта. Поэтому перегрузка оператора +, например, для обработки связного списка не меняет его назначение по отношению к целым числам, т.е. к их сложению.
Главное преимущество перегрузки операторов заключается в том, что она позволяет плавно интегрировать класс нового типа в среду программирования. Подобного рода расширяемость типов является важной составляющей эффективности такого объектно-ориентированного языка программирования, как С#. Как только для класса определяются операторы, появляется возможность оперировать объектами этого класса, используя обычный синтаксис выражений в С#. Перегрузка операторов является одной из самых сильных сторон языка С#.
Основы перегрузки операторов
Перегрузка операторов тесно связана с перегрузкой методов. Для перегрузки оператора служит ключевое слово operator
, определяющее
Существуют две формы операторных методов (operator
): одна — для унарных операторов, другая — для бинарных. Ниже приведена общая форма для каждой разновидности этих методов.
// Общая форма перегрузки унарного оператора.
public static
{
// операции
}
// Общая форма перегрузки бинарного оператора.
public static
}
Здесь вместо public
и static
.
Тип операнда унарных операторов должен быть таким же, как и у класса, для которого перегружается оператор. А в бинарных операторах хотя бы один из операндов должен быть такого же типа, как и у его класса. Следовательно, в C# не допускается перегрузка любых операторов для объектов, которые еще не были созданы. Например, назначение оператора + нельзя переопределить для элементов типа int
или string
.
И еще одно замечание: в параметрах оператора нельзя использовать модификатор ref
или out
.
Для того чтобы продемонстрировать принцип действия перегрузки операторов, начнем с простого примера, в котором перегружаются два оператора — + и -. В приведенной ниже программе создается класс ThreeD
, содержащий координаты объекта в трехмерном пространстве. Перегружаемый оператор + складывает отдельные координаты одного объекта типа ThreeD
с координатами другого. А перегружаемый оператор - вычитает координаты одного объекта из координат другого.
// Пример перегрузки бинарных операторов.
using System;
// Класс для хранения трехмерных координат,
class ThreeD {
int x, y, z; // трехмерные координаты
public ThreeD() {
x = y = z = 0;
}
public ThreeD(int i, int j, int k) {
x = i; y = j; z = k;
}
// Перегрузить бинарный оператор +.
public static ThreeD operator +(ThreeD op1, ThreeD op2)
{
ThreeD result = new ThreeD();
/* Сложить координаты двух точек и возвратить результат. */
result.x = op1.x + op2.x; // Эти операторы выполняют