Перегрузка операторов

Язык 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);
    }
}

results matching ""

    No results matching ""