Überladen von Operatoren (C# und Java im Vergleich)

Aktualisiert: November 2007

Wie in C++ können Sie auch in C# Operatoren überladen, um sie in eigenen Klassen zu verwenden. Auf diese Weise wirkt ein benutzerdefinierter Datentyp genauso ursprünglich und ist ebenso logisch in seiner Anwendung wie die integrierten Datentypen. So können Sie z. B. zur Darstellung einer komplexen Zahl einen neuen Datentyp mit dem Namen ComplexNumber erstellen und Methoden bereitstellen, die mit den arithmetischen Standardoperatoren mathematische Operationen mit dieser Art von Zahlen ausführen, z. B. das Addieren von zwei komplexen Zahlen mit dem Operator +.

Um einen Operator zu überladen, müssen Sie eine Funktion schreiben, deren Name aus dem Wort operator und dem Symbol für den zu überladenden Operator besteht. So überladen Sie beispielsweise den Operator +:

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

Alle Operatorüberladungen sind statische Methoden der Klasse. Beachten Sie, dass Sie beim Überladen des Gleichheitsoperators (==) auch den Ungleichheitsoperator (!=) überladen müssen. Die Operatoren < und > sowie die Operatoren <= und >= sollten auch paarweise überladen werden.

Es folgt eine Liste mit allen Operatoren, die Sie überladen können:

  • Unäre Operatoren: +, -, !, ~, ++, --, true, false

  • Binäre Operatoren: +-*, /, %, &, |, ^, <<, >>, ==, !=, >, <, >=, <=

Im folgenden Codebeispiel wird eine ComplexNumber-Klasse erstellt, die die Operatoren + und - überlädt:

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);
    }
}

Innerhalb dieser Klasse können Sie mit dem folgenden Code zwei komplexe Zahlen erstellen und bearbeiten:

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());
    }
}

Wie Sie im Programm sehen, können die Operatoren Plus und Minus ganz intuitiv für die Objekte der ComplexNumber-Klasse verwendet werden. Die Ausgabe würde folgendermaßen aussehen:

Complex Number a = 10 + 12i

Complex Number b = 8 + 9i

Complex Number sum = 18 + 21i

Complex Number difference = 2 + 3i

Java unterstützt das Überladen von Operatoren nicht, obwohl es intern den Operator + für Zeichenfolgenverkettungen überlädt.

Siehe auch

Aufgaben

Beispiel zum Überladen von Operatoren

Konzepte

C#-Programmierhandbuch

Referenz

Überladbare Operatoren (C#-Programmierhandbuch)

Weitere Ressourcen

Die Programmiersprache C# für Java-Entwickler