Surcharge des opérateurs en C#
Vous pouvez surcharger la plupart des opérateurs disponibles en C#. Les opérateurs surchargés sont des fonctions avec des noms spéciaux, le mot-clé « operator » suivi du symbole de l’opérateur. Comme toute autre fonction, un opérateur surchargé a un type de retour et une liste de paramètres.
Syntaxe :
public static returnType operator op (argumentList)
« op » est l’opérateur à surcharger et « operator » est le mot clé requis. Pour surcharger les opérateurs unaires, il n’y a qu’un seul argument et pour surcharger un opérateur binaire, il y a deux arguments. N’oubliez pas qu’au moins un des arguments doit être un type défini par l’utilisateur, tel que class ou struct.
Les opérateurs disponible en C#
+, -,!, ~, ++, – – | Les opérateurs unaires prennent un seule opérande et peuvent être surchargés. |
+, -, *, /, % | Les opérateurs binaires prennent deux opérandes et peuvent être surchargés. |
==,! =, = | Les opérateurs de comparaison peuvent être surchargés. |
&&, || | Les opérateurs logiques conditionnels ne peuvent pas être surchargés directement |
+=, -+, *=, /=, %=, = | Les opérateurs d’affectation ne peuvent pas être surchargés. |
Surcharge des opérateurs unaires
Le programme suivant surcharge l’opérateur unaire – à l’intérieur de la classe Point.
using System; class Point { private int x; private int y; public Point() { } public Point(int i, int j) { x = i; y = j; } public void display() { Console.WriteLine("{0} {1}", x, y); } public static Point operator -(Point p) { Point point = new Point(); point.x = -p.x; point.y = -p.y; return point; } } public class WayToLearnX { public static void Main() { Point p1 = new Point(2, 4); p1.display(); Point p2 = new Point(); p2.display(); p2 = -p1; p2.display(); } }
La sortie :
2 4 0 0 -2 -4
Surcharge des opérateurs binaires
L’opérateur binaire surchargé doit prendre deux arguments.
using System; class Point { private int x; private int y; public Point() { } public Point(int i, int j) { x = i; y = j; } public void display() { Console.WriteLine("{0} {1}", x, y); } public static Point operator +(Point p1, Point p2) { Point point = new Point(); point.x = p1.x + p2.x; point.y = p1.y + p2.y; return point; } } public class WayToLearnX { public static void Main() { Point p1 = new Point(2, 4); p1.display(); Point p2 = new Point(1, 2); p2.display(); Point p3 = new Point(); p3.display(); p3 = p1 + p2; p3.display(); } }
La sortie :
2 4 1 2 0 0 3 6
Surcharger l’opérateur == et !=
using System; class Point { private int x; private int y; public Point() { } public Point(int i, int j) { x = i; y = j; } public void display() { Console.WriteLine("{0} {1}", x, y); } public override int GetHashCode() { return this.ToString().GetHashCode(); } public override bool Equals(object o) { var p = (Point)o; if (p.x == this.x && p.y == this.y) return true; else return false; } public static bool operator == (Point p1, Point p2) { return p1.Equals(p2); } public static bool operator != (Point p1, Point p2) { return ! p1.Equals(p2); } } public class WayToLearnX { public static void Main() { Point p1 = new Point(2, 4); p1.display(); Point p2 = new Point(2, 4); p2.display(); if (p1 == p2) Console.WriteLine("p1 et p2 sont égale."); else Console.WriteLine("p1 et p2 ne sont pas égale."); } }
La sortie :
2 4 2 4 p1 et p2 sont égale.
La méthode Equals() par défaut compare les références. Rappelez-vous que les valeurs des objets p1 et p2 sont identiques. Mais ils ont des références différentes.
N’oubliez pas que lorsque nous surchargeons la méthode Equals() à l’intérieur d’une classe, nous devrons également surcharger la méthode GetHashCode(). Également si nous surchargeons l’opérateur == à l’intérieur d’une classe, nous devons également surcharger l’opérateur !=.