Maîtriser la surcharge d'opérateurs en C# pour types personnalisés
On peut redéfinir ou surcharger la plupart des opérateurs intégrés C# pour les utiliser avec des types utilisateur. Un opérateur surchargé est une fonction avec le mot-clé operator suivi du symbole.
Implémentation
Exemple : surcharge de + pour une classe Boite :
public static Boite operator+ (Boite b, Boite c)
{
Boite boite = new Boite();
boite.longueur = b.longueur + c.longueur;
boite.largeur = b.largeur + c.largeur;
boite.hauteur = b.hauteur + c.hauteur;
return boite;
}
Exemple complet
using System;
namespace ApplicationSurchargeOperateurs
{
class Boite
{
private double longueur, largeur, hauteur;
public double ObtenirVolume() { return longueur * largeur * hauteur; }
public void DefinirLongueur(double len) { longueur = len; }
public void DefinirLargeur(double bre) { largeur = bre; }
public void DefinirHauteur(double hei) { hauteur = hei; }
// Surcharge +
public static Boite operator+ (Boite b, Boite c)
{
Boite boite = new Boite();
boite.longueur = b.longueur + c.longueur;
boite.largeur = b.largeur + c.largeur;
boite.hauteur = b.hauteur + c.hauteur;
return boite;
}
}
class Test
{
static void Main(string[] args)
{
Boite b1 = new Boite();
Boite b2 = new Boite();
Boite b3 = new Boite();
double volume = 0.0;
b1.DefinirLongueur(6.0); b1.DefinirLargeur(7.0); b1.DefinirHauteur(5.0);
b2.DefinirLongueur(12.0); b2.DefinirLargeur(13.0); b2.DefinirHauteur(10.0);
volume = b1.ObtenirVolume();
Console.WriteLine("Volume Boîte 1 : {0}", volume);
volume = b2.ObtenirVolume();
Console.WriteLine("Volume Boîte 2 : {0}", volume);
// Addition d'objets
b3 = b1 + b2;
volume = b3.ObtenirVolume();
Console.WriteLine("Volume Boîte 3 : {0}", volume);
Console.ReadKey();
}
}
}
Résultat :
Volume Boîte 1 : 210
Volume Boîte 2 : 1560
Volume Boîte 3 : 5400
Opérateurs surchargeables et non surchargeables
| Catégorie | Opérateurs | Surchargeable |
|---|---|---|
| Unaires | +, -, !, ~, ++, -- | Oui |
| Binaires arithmétiques | +, -, *, /, % | Oui |
| Comparaison | ==, !=, <, >, <=, >= | Oui |
| Logiques conditionnels | &&, || | Non (directement) |
| Assignation composés | +=, -=, *=, /=, %= | Non |
| Autres | =, ., ?:, ->, new, is, sizeof, typeof | Non |
Exemple étendu : surcharge comparaison et ToString
// Dans classe Boite...
public static bool operator == (Boite g, Boite d)
{
return g.longueur == d.longueur && g.hauteur == d.hauteur && g.largeur == d.largeur;
}
public static bool operator != (Boite g, Boite d) { return !(g == d); }
public static bool operator < (Boite g, Boite d) { return g.longueur < d.longueur && g.hauteur < d.hauteur && g.largeur < d.largeur; }
public static bool operator > (Boite g, Boite d) { return g.longueur > d.longueur && g.hauteur > d.hauteur && g.largeur > d.largeur; }
public static bool operator <= (Boite g, Boite d) { return g.longueur <= d.longueur && g.hauteur <= d.hauteur && g.largeur <= d.largeur; }
public static bool operator >= (Boite g, Boite d) { return g.longueur >= d.longueur && g.hauteur >= d.hauteur && g.largeur >= d.largeur; }
public override string ToString()
{
return String.Format("({0}, {1}, {2})", longueur, largeur, hauteur);
}
Langue C
- Opérateurs C# — Guide complet des opérateurs en C#
- Opérateur ternaire C# : Guide concis pour les expressions conditionnelles
- Maîtriser la surcharge de méthodes en C# : Concepts, exemples et bonnes pratiques
- Maîtriser la surcharge de constructeurs en C#
- Maîtriser la surcharge d'opérateurs en Python : guide pratique
- L'opérateur instanceof en Java : guide complet
- Robot DIY inspiré de Wall‑E : Raspberry Pi dans une boîte de CD recyclée
- Maintenance impliquant les opérateurs : les gains l'emportent-ils sur les coûts cachés ?
- Surcharge d'opérateurs en C++ : Guide pratique avec exemples de code