Come lavorare con l'overloading degli operatori in C #

Il polimorfismo è uno dei principi di base dell'OOP (Object Oriented Programming). La parola polimorfismo deriva da due parole: "poly" che significa molti e "morph" che significa forme. Quindi, il polimorfismo implica l'esistenza della stessa cosa ma in forme diverse.

Il sovraccarico degli operatori è un esempio di polimorfismo statico. È possibile sfruttare il sovraccarico degli operatori o aggiungere funzionalità agli operatori in modo da lavorare con i tipi definiti dall'utente nello stesso modo in cui si lavora con i tipi di dati fondamentali.

Quali sono gli operatori e quali sono gli operatori che possono essere sovraccaricati?

In un'espressione in genere sono presenti operatori e operandi. Gli operatori sono quelli che lavorano sugli operandi e fanno tutti parte di un'espressione. Ad esempio, la seguente è un'espressione che contiene due operandi e un operatore. Gli operandi sono X e Y e l'operatore è +.

X + Y

Gli operatori sono classificati come unari, binari, di confronto, di assegnazione, ecc. A seconda del loro scopo e del numero di operandi su cui lavorerebbero gli operatori. Sebbene la maggior parte degli operatori possa essere sovraccaricata, si applicano alcune restrizioni. In sostanza, non tutti gli operatori possono essere sovraccaricati.

Gli operatori unari, ovvero gli operatori che lavorano con un operando, possono essere sovraccaricati. Puoi anche sovraccaricare gli operatori binari e gli operatori di confronto come, ==,! =,, =. Tuttavia, non è possibile sovraccaricare gli operatori =,?, ->, new, is, sizeof o typeof. Non è inoltre possibile sovraccaricare gli operatori condizionali come && e || facilmente. Inoltre, non è possibile eseguire l'overload dell'operatore di indicizzazione dell'array [].

Puoi saperne di più su ciò che tutti gli operatori possono essere sovraccaricati da questo articolo di MSDN.

Implementazione dell'overloading degli operatori in C #

In questa sezione esploreremo come implementare l'overloading degli operatori in C #. Considera la seguente classe denominata DistanceCalculator.

public class DistanceCalculator

   {

       Int32 feet = 0, inch = 0;

       public DistanceCalculator(Int32 feet = 0, Int32 inch = 0)

       {

           this.feet = feet;

           this.inch = inch;

       }

   }

Fare riferimento all'elenco dei codici sopra. La classe DistanceCalculator contiene due membri dati di tipo Int32, ovvero piedi e pollici. Aggiungeremo ora più metodi a questa classe per illustrare come è possibile sovraccaricare gli operatori.

Quando si lavora con il sovraccarico dell'operatore, è necessario tenere a mente alcuni punti. L'operatore da sovraccaricare deve avere un metodo corrispondente contrassegnato con l'operatore parola chiave. Gli argomenti della funzione operatore sono operandi e la funzione operatore può restituire un valore. La funzione operatore dovrebbe essere statica e dovrebbe essere un membro del tipo contenitore.

Il frammento di codice seguente illustra l'aspetto di una tipica funzione operatore. Questo esempio mostra come gli operatori == e! = Possono essere sovraccaricati.

public static bool operator ==(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value == obj2.Value;

       }

       public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value != obj2.Value;

       }

Notare che Value è una proprietà che restituisce il valore in termini di pollici.

public Int32 Value

       {

           get

           {

               return (feet * 12) + inch;

           }

       }

Ecco l'elenco completo del codice della classe DistanceCalculator.

public class DistanceCalculator

   {

       Int32 feet = 0, inch = 0;

       public DistanceCalculator(Int32 feet = 0, Int32 inch = 0)

       {

           this.feet = feet;

           this.inch = inch;

       }

       public static bool operator ==(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value == obj2.Value;

       }

       public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value != obj2.Value;

       }

       public override bool Equals(object obj)

       {

           DistanceCalculator distanceCalculator = obj as DistanceCalculator;

           if (distanceCalculator != null)

           {

               return (distanceCalculator == this);

           }

           return false;

       }

       public override int GetHashCode()

       {

           return Value.GetHashCode();

       }

     public Int32 Feet

       {

           get { return feet; }

       }

       public Int32 Inch

       {

           get { return inch; }

       }

       public Int32 Value

       {

           get

           {

               return (feet * 12) + inch;

           }

       }

   }

Il frammento di codice seguente illustra come utilizzare la classe DistanceCalculator.

static void Main(string[] args)

       {

           DistanceCalculator obj1 = new DistanceCalculator(1, 2);

           DistanceCalculator obj2 = new DistanceCalculator(1, 2);

           Console.WriteLine((obj1 == obj2).ToString());

           Console.Read();

       }

Il frammento di codice seguente mostra come eseguire l'overload dell'operatore + per aggiungere due oggetti.

public static DistanceCalculator operator +(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           Int32 totalInches = obj1.Value + obj2.Value;

           Int32 feet = totalInches / 12;

           Int32 inch = totalInches % 12;

           DistanceCalculator temp = new DistanceCalculator(feet, inch);

           return temp;

       }

Aggiungiamo le seguenti due proprietà alla classe DistanceCalculator. Il frammento di codice seguente mostra come aggiungere due oggetti di tipo DistanceCalculator e restituire l'oggetto risultante come lo stesso tipo, ovvero l'oggetto restituito è di tipo DistanceCalculator.

public Int32 Feet

       {

           get { return feet; }

       }

       public Int32 Inch

       {

           get { return inch; }

       }

Ecco come creare due istanze della classe DistanceCalculator e sfruttare la funzione dell'operatore sovraccarico per assegnare il risultato a un altro oggetto dello stesso tipo.

static void Main(string[] args)

       {

           DistanceCalculator obj1 = new DistanceCalculator(1, 11);

           DistanceCalculator obj2 = new DistanceCalculator(1, 2);

           DistanceCalculator obj3 = obj1 + obj2;

           Console.WriteLine("Feet: "+obj3.Feet.ToString());

           Console.WriteLine("Inch: " + obj3.Inch.ToString());

           Console.Read();

       }