Перегрузка операторов
Язык C# позволяет выполнять перегрузку операторов для их использования в собственных классах. Это позволяет добиться естественного вида определяемого пользователем типа данных и использовать его в качестве основного типа данных. Например, можно создать новый тип данных с именем ComplexNumber, представляющий комплексное число, и определить методы выполнения математических операций над такими числами с использованием стандартных арифметических операторов, например оператора + для сложения двух комплексных чисел. Чтобы выполнить перегрузку оператора, необходимо написать функцию с указанием имени оператора, а затем символа оператора, для которого выполняется перегрузка. Например, так выполняется перегрузка оператора +:
public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b)
Все перегрузки операторов являются статическими методами класса. Кроме того,
следует учесть, что если перегружается оператор равенства ==
,
то необходимо перегрузить и оператор неравенства !=
. Операторы <
и >
,
а также <=
и >=
тоже следует перегружать парами.
Ниже приведен полный список операторов, которые можно перегрузить:
- Унарные операторы:
+
,-
,!
,~
,++
,--
,true
,false
- Бинарные операторы:
+
,-
,*
,/
,%
,&
,|
,^
,<<
,>>
,==
,!=
,>
,<
,>=
,<=
Приведенный ниже пример кода создает класс ComplexNumber, который перегружает операторы + и -:
public class ComplexNumber
{
private int real;
private int imaginary;
// Конструктор по умолчанию
public ComplexNumber()
{
real = 0;
imaginary = 0;
}
public ComplexNumber(int r, int i)
{
real = r;
imaginary = i;
}
// Переопределение ToString для вывода комплексного числа на экран
public override string ToString()
{
String sign = "+";
if(imaginary < 0){
sign = "-";
}
return(System.String.Format("{0} {1} {2}i", real, sign, imaginary));
}
// Переопределение оператора сложения `+`
public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b)
{
return new ComplexNumber(a.real + b.real, a.imaginary + b.imaginary);
}
// Переопределение оператора вычитания `-`
public static ComplexNumber operator-(ComplexNumber a, ComplexNumber b)
{
return new ComplexNumber(a.real - b.real, a.imaginary - b.imaginary);
}
}