Programmation C sharp/Surcharge des opérateurs

Un livre de Wikilivres.
Programmation C#
Programmation C#
Modifier ce modèle

La surcharge des opérateurs permet d'utiliser les opérateurs sur d'autres types (des classes) que les types simples.

Certains opérateurs ne sont pas surchargeables. Il s'agit des opérateurs en rouge dans le tableau du chapitre Les opérateurs.

Syntaxe[modifier | modifier le wikicode]

L'opérateur surdéfini doit toujours être statique et public, sinon le compilateur génère une erreur. L'opérateur est déclaré en utilisant le mot clé operator suivi de l'opérateur surdéfini.

Exemple :

public class NombreComplexe
{
    private double n_reel, n_imag;

    public NombreComplexe() {}

    public NombreComplexe(double r,double i)
    { this.n_reel = r; this.n_imag = i; }

    public static NombreComplexe operator +
        (NombreComplexe a,NombreComplexe b)
    {
        return new NombreComplexe
          ( a.n_reel + b.n_reel , a.n_imag + b.n_imag );
    }
}

Implémentation par paire[modifier | modifier le wikicode]

La surdéfinition de certains opérateurs exige également la surdéfinition d'un autre. Ces opérateurs doivent donc être surdéfinis par paire.

Il s'agit des paires d'opérateurs suivantes :

  • operator < et operator >
  • operator <= et operator >=
  • operator == et operator !=

En général, l'un des deux peut être défini en fonction de l'autre :

  • operator < en fonction de operator >
    public static bool operator < (NombreComplexe a,NombreComplexe b)
    {
        return b > a;
    }
  • operator > en fonction de operator <
    public static bool operator > (NombreComplexe a,NombreComplexe b)
    {
        return b < a;
    }
  • operator <= en fonction de operator >=
    public static bool operator <= (NombreComplexe a,NombreComplexe b)
    {
        return b >= a;
    }
  • operator >= en fonction de operator <=
    public static bool operator >= (NombreComplexe a,NombreComplexe b)
    {
        return b <= a;
    }
  • operator == en fonction de operator !=
    public static bool operator == (NombreComplexe a,NombreComplexe b)
    {
        return !( a != b );
    }
  • operator != en fonction de operator ==
    public static bool operator != (NombreComplexe a,NombreComplexe b)
    {
        return !( a == b );
    }

Opérateurs de conversions[modifier | modifier le wikicode]

Les opérateurs de conversions sont déclarés dans une classe C en ajoutant une méthode utilisant la syntaxe suivante :

operator type_cible(type_source valeur)

où l'un des deux types est la classe C : convertir un objet de classe C vers type_cible ou un objet de type type_source vers classe C.

Exemple:

public class Fraction
{
    private int numerateur, denominateur;

    public Fraction(int n, int d)
    { this.numerateur = n; this.denominateur = d; }

    public double GetValue()
    { return this.numerateur / this.denominateur; }

    public static implicit operator double(Fraction f)
    {
        return f.GetValue();
    }

    public static implicit operator Fraction(int entier)
    {
        return new Fraction(entier, 1);
    }
}
...
Fraction f=new Fraction(1,3);
double d = f; // -> 0.33333...
...
Fraction f;
f = 5; // -> 5 / 1

Explicite/Implicite[modifier | modifier le wikicode]

L'opérateur de conversion doit être déclaré avec l'un des mots-clés implicit ou explicit pour qu'il soit utilisé respectivement implicitement ou explicitement.

Exemple:

public class Fraction
{
    private int numerateur, denominateur;

    public Fraction(int n, int d)
    { this.numerateur = n; this.denominateur = d; }

    public double GetValue()
    { return this.numerateur / this.denominateur; }

    public static explicit operator Fraction(int entier)
    {
        return new Fraction(entier, 1);
    }
}
...
Fraction f;
f = (Fraction)5; // conversion explicite -> 5 / 1