Перегрузка операторов (сравнение C# и Java)

Обновлен: Ноябрь 2007

Как и C++, язык C# позволяет выполнять перегрузку операторов для их использования в собственных классах. Это позволяет добиться естественного вида определяемого пользователем типа данных и использовать его в качестве основного типа данных. Например, можно создать новый тип данных с именем ComplexNumber, представляющий комплексное число, и определить методы выполнения математических операций над такими числами с использованием стандартных арифметических операторов, например оператора + для сложения двух комплексных чисел.

Чтобы выполнить перегрузку оператора, необходимо написать функцию с указанием имени оператора, а затем символа оператора, для которого выполняется перегрузка. Например, так выполняется перегрузка оператора +:

public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b)

Все перегрузки операторов являются статическими методами класса. Кроме того, следует учесть, что если перегружается оператор равенства (==), то необходимо перегрузить и оператор неравенства (!=). Операторы < и >, а также <= и >= тоже следует перегружать парами.

Ниже приведен полный список операторов, которые можно перегрузить:

  • Унарные операторы: +, -, !, ~, ++, --, true, false

  • Бинарные операторы: +, -, *, /, %, &, |, ^, <<, >>, ==, !=, >, <, >=, <=

Приведенный ниже пример кода создает класс ComplexNumber, который перегружает операторы + и -:

public class ComplexNumber
{
    private int real;
    private int imaginary;

    public ComplexNumber() : this(0, 0)  // constructor
    {
    }

    public ComplexNumber(int r, int i)  // constructor
    {
        real = r;
        imaginary = i;
    }

    // Override ToString() to display a complex number in the traditional format:
    public override string ToString()
    {
        return(System.String.Format("{0} + {1}i", real, imaginary));
    }

    // Overloading '+' operator:
    public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b)
    {
        return new ComplexNumber(a.real + b.real, a.imaginary + b.imaginary);
    }

    // Overloading '-' operator:
    public static ComplexNumber operator-(ComplexNumber a, ComplexNumber b)
    {
        return new ComplexNumber(a.real - b.real, a.imaginary - b.imaginary);
    }
}

Этот класс позволяет создавать комплексные числа и выполнять операции с двумя комплексными числами:

class TestComplexNumber
{
    static void Main()
    {
        ComplexNumber a = new ComplexNumber(10, 12);
        ComplexNumber b = new ComplexNumber(8, 9);

        System.Console.WriteLine("Complex Number a = {0}", a.ToString());
        System.Console.WriteLine("Complex Number b = {0}", b.ToString());

        ComplexNumber sum = a + b;
        System.Console.WriteLine("Complex Number sum = {0}", sum.ToString());

        ComplexNumber difference = a - b;
        System.Console.WriteLine("Complex Number difference = {0}", difference.ToString());
    }
}

Как наглядно показано в программе, теперь можно использовать операторы "плюс" и "минус" для объектов, принадлежащих к классу ComplexNumber. Ниже приведены выходные данные:

Complex Number a = 10 + 12i

Complex Number b = 8 + 9i

Complex Number sum = 18 + 21i

Complex Number difference = 2 + 3i

Язык Java не поддерживает перегрузку операторов, хотя он выполняет внутреннюю перегрузку оператора + для объединения строк.

См. также

Задачи

Пример перегрузки оператора

Основные понятия

Руководство по программированию в C#

Ссылки

Перегружаемые операторы (Руководство по программированию в C#)

Другие ресурсы

Язык программирования C# для разработчиков на Java