Programmation C sharp/Surcharge des opérateurs

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

Programmation C#
Programmation C#
Modifier ce modèle

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

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

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

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

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