C# Surcharge des opérateurs
Vous pouvez redéfinir ou surcharger les opérateurs intégrés en C#. Par conséquent, les programmeurs peuvent aussi utiliser des opérateurs avec des types définis par l’utilisateur. Les opérateurs surchargés sont des fonctions portant des noms spéciaux, définies par le mot-cléoperatorsuivi du symbole de l’opérateur. Comme les autres fonctions, les opérateurs surchargés ont un type de retour et une liste de paramètres.
Par exemple, considérons la fonction suivante :
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
La fonction ci-dessus implémente l'opérateur d'addition (+) pour la classe Box définie par l'utilisateur. Elle additionne les propriétés de deux objets Box et renvoie l'objet Box résultant.
Implémentation de la surcharge d'opérateurs
Le programme suivant démontre l'implémentation complète :
Exemple
namespace OperatorOvlApplication
{
class Box
{
private double length; // Longueur
private double breadth; // Largeur
private double height; // Hauteur
public double getVolume()
{
return length * breadth * height;
}
public void setLength( double len )
{
length = len;
}
public void setBreadth( double bre )
{
breadth = bre;
}
public void setHeight( double hei )
{
height = hei;
}
// Surcharger l'opérateur + pour additionner deux objets Box
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
}
class Tester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // Déclarer Box1 de type Box
Box Box2 = new Box(); // Déclarer Box2 de type Box
Box Box3 = new Box(); // Déclarer Box3 de type Box
double volume = 0.0; // volume
// Détails de Box1
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// Détails de Box2
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// Volume de Box1
volume = Box1.getVolume();
Console.WriteLine("Volume de Box1 : {0}", volume);
// Volume de Box2
volume = Box2.getVolume();
Console.WriteLine("Volume de Box2: {0}", volume);
// additionner deux objets
Box3 = Box1 + Box2;
// Volume de Box3
volume = Box3.getVolume();
Console.WriteLine("Volume de Box3: {0}", volume);
Console.ReadKey();
}
}
}
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :
Box1 的体积: 210 Box2 的体积: 1560 Box3 的体积: 5400
Opérateurs qui peuvent et ne peuvent pas être surchargés
Le tableau suivant décrit les capacités de la surcharge d'opérateurs en C# :
| Opérateurs | Description |
|---|---|
| +, -, !, ~, ++, -- | Ces opérateurs unaires prennent un seul opérande et peuvent être surchargés. |
| +, -, *, /, % | Ces opérateurs binaires prennent deux opérandes et peuvent être surchargés. |
| ==, !=, <, >, <=, >= | Ces opérateurs de comparaison peuvent être surchargés. |
| &&, || | Ces opérateurs logiques conditionnels ne peuvent pas être surchargés directement. |
| +=, -=, *=, /=, %= | Ces opérateurs d'affectation ne peuvent pas être surchargés. |
| =, ., ?:, ->, new, is, sizeof, typeof | Ces opérateurs ne peuvent pas être surchargés. |
Exemple
D'après la discussion ci-dessus, étendons l'exemple ci-dessus pour surcharger davantage d'opérateurs :
Exemple
namespace OperatorOvlApplication
{
class Box
{
private double length; // Longueur
private double breadth; // Largeur
private double height; // Hauteur
public double getVolume()
{
return length * breadth * height;
}
public void setLength( double len )
{
length = len;
}
public void setBreadth( double bre )
{
breadth = bre;
}
public void setHeight( double hei )
{
height = hei;
}
// Surcharger l'opérateur + pour additionner deux objets Box
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
public static bool operator == (Box lhs, Box rhs)
{
bool status = false;
if (lhs.length == rhs.length && lhs.height == rhs.height
&& lhs.breadth == rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator !=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length != rhs.length || lhs.height != rhs.height
|| lhs.breadth != rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator <(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length < rhs.length && lhs.height
< rhs.height && lhs.breadth < rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator >(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length > rhs.length && lhs.height
> rhs.height && lhs.breadth > rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator <=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length <= rhs.length && lhs.height
<= rhs.height && lhs.breadth <= rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator >=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length >= rhs.length && lhs.height
>= rhs.height && lhs.breadth >= rhs.breadth)
{
status = true;
}
return status;
}
public override string ToString()
{
return String.Format("({0}, {1}, {2})", length, breadth, height);
}
}
class Tester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // Déclarer Box1 de type Box
Box Box2 = new Box(); // Déclarer Box2 de type Box
Box Box3 = new Box(); // Déclarer Box3 de type Box
Box Box4 = new Box();
double volume = 0.0; // volume
// Détails de Box1
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// Détails de Box2
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// Utiliser la surcharge de ToString() pour afficher les deux boîtes
Console.WriteLine("Box1: {0}", Box1.ToString());
Console.WriteLine("Box2: {0}", Box2.ToString());
// Volume de Box1
volume = Box1.getVolume();
Console.WriteLine("Volume de Box1 : {0}", volume);
// Volume de Box2
volume = Box2.getVolume();
Console.WriteLine("Volume de Box2: {0}", volume);
// additionner deux objets
Box3 = Box1 + Box2;
Console.WriteLine("Box3: {0}", Box3.ToString());
// Volume de Box3
volume = Box3.getVolume();
Console.WriteLine("Volume de Box3: {0}", volume);
//comparaison des boîtes
if (Box1 > Box2)
Console.WriteLine(Box1 est supérieur à Box2);
else
Console.WriteLine("Box1 n'est pas supérieur à Box2");
if (Box1 < Box2)
Console.WriteLine(Box1 est inférieur à Box2);
else
Console.WriteLine("Box1 n'est pas inférieur à Box2");
if (Box1 >= Box2)
Console.WriteLine("Box1 est supérieur ou égal à Box2");
else
Console.WriteLine(Box1 n'est pas supérieur ou égal à Box2);
if (Box1 <= Box2)
Console.WriteLine("Box1 est inférieur ou égal à Box2");
else
Console.WriteLine(Box1 n'est pas inférieur ou égal à Box2);
if (Box1 != Box2)
Console.WriteLine("Box1 n'est pas égal à Box2");
else
Console.WriteLine(Box1 est égal à Box2);
Box4 = Box3;
if (Box3 == Box4)
Console.WriteLine(Box3 est égal à Box4);
else
Console.WriteLine("Box3 n'est pas égal à Box4");
Console.ReadKey();
}
}
}
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :
Box1: (6, 7, 5) Box2: (12, 13, 10) Box1 的体积: 210 Box2 的体积: 1560 Box3: (18, 20, 15) Box3 的体积: 5400 Box1 不大于 Box2 Box1 小于 Box2 Box1 不大于等于 Box2 Box1 小于等于 Box2 Box1 不等于 Box2 Box3 等于 Box4autres extensions