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 :

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;
}

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

using System;

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érateursDescription
+, -, !, ~, ++, --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, typeofCes 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

using System;

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 等于 Box4
autres extensions