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
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
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 <
etoperator >
operator <=
etoperator >=
operator ==
etoperator !=
En général, l'un des deux peut être défini en fonction de l'autre :
operator <
en fonction deoperator >
public static bool operator < (NombreComplexe a,NombreComplexe b)
{
return b > a;
}
operator >
en fonction deoperator <
public static bool operator > (NombreComplexe a,NombreComplexe b)
{
return b < a;
}
operator <=
en fonction deoperator >=
public static bool operator <= (NombreComplexe a,NombreComplexe b)
{
return b >= a;
}
operator >=
en fonction deoperator <=
public static bool operator >= (NombreComplexe a,NombreComplexe b)
{
return b <= a;
}
operator ==
en fonction deoperator !=
public static bool operator == (NombreComplexe a,NombreComplexe b)
{
return !( a != b );
}
operator !=
en fonction deoperator ==
public static bool operator != (NombreComplexe a,NombreComplexe b)
{
return !( a == b );
}
Opérateurs de conversions
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
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