Surcharge d'opérateur (C# et Java)

Mise à jour : novembre 2007

Comme C++, C# vous permet de surcharger des opérateurs à utiliser sur vos propres classes. Cela permet à un type de données défini par l'utilisateur de paraître aussi naturel et d'être aussi logique à utiliser qu'un type de données fondamental. Par exemple, vous pouvez créer un nouveau type de données appelé ComplexNumber pour représenter un nombre complexe et fournir des méthodes qui effectuent des opérations mathématiques sur les nombres de ce type à l'aide d'opérateurs arithmétiques standard, comme utiliser l'opérateur + pour additionner deux nombres complexes.

Pour surcharger un opérateur, vous écrivez une fonction qui a l'opérateur de nom suivi du symbole de l'opérateur à surcharger. Par exemple, voici comment surcharger l'opérateur + :

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

Toutes les surcharges d'opérateur sont des méthodes statiques de la classe. Sachez aussi que si vous surchargez l'opérateur d'égalité (==), vous devez également surcharger l'opérateur d'inégalité (!=). Les opérateurs < et > ainsi que les opérateurs <= et >= doivent également être surchargés en paires.

La liste complète des opérateurs pouvant être surchargés est la suivante :

  • Opérateurs unaires : +, -, !, ~, ++, --, true, false.

  • Opérateurs binaires : +, -*/, %, &, |, ^, <<, >>, ==, !=, >, <, >=, <=.

L'exemple de code suivant crée une classe ComplexNumber qui surcharge les opérateurs + et - :

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

Cette classe vous permet de créer et de manipuler deux nombres complexes avec un code tel que celui-ci :

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

Comme le programme le montre, vous pouvez maintenant utiliser les opérateurs plus et moins sur les objets qui appartiennent à votre classe ComplexNumber de manière parfaitement intuitive. Voici la sortie que vous obtenez :

Complex Number a = 10 + 12i

Complex Number b = 8 + 9i

Complex Number sum = 18 + 21i

Complex Number difference = 2 + 3i

Java ne prend pas en charge la surcharge d'opérateur, bien qu'il surcharge en interne l'opérateur + pour la concaténation de chaînes.

Voir aussi

Tâches

Surcharge d'opérateur, exemple

Concepts

Guide de programmation C#

Référence

Opérateurs surchargeables (Guide de programmation C#)

Autres ressources

Langage de programmation C# pour les développeurs Java