Overloading degli Operatori in C#

Una caratteristica estremamente potente ed utile di alcuni linguaggi come il C++ o lo stesso C# è l’overloading degli operatori, quindi avere la possibilità di inserire qualsiasi istruzione nelle operazioni di classi definite dall’utente. Come sempre vediamo di capire come funzionano tramite un esempio esplicativo.

using System;
public class CCerchio
{
  private double m_dRaggio;
  public CCerchio() { m_dRaggio = 0.0; }
  public CCerchio(double dRaggio) { m_dRaggio = dRaggio; }
  public double Raggio
  {
    get { return m_dRaggio; }
    set { m_dRaggio = value; }
  }

  public double Area
  {
    get { return Math.PI * Math.Pow(m_dRaggio, 2.0); }
    set { m_dRaggio = Math.Sqrt(value / Math.PI); }
  }

  public double Circonferenza
  {
    get { return 2 * Math.PI * m_dRaggio; }
    set { m_dRaggio = value / (2 * Math.PI); }
  }

  public static CCerchio operator+( CCerchio c1, CCerchio c2)
  {
    double dSumRaggio = c1.m_dRaggio + c2.m_dRaggio;
    return new CCerchio(dSumRaggio);
  }

  public static CCerchio operator-(CCerchio c1, CCerchio c2)
  {
    double dSumRaggio = c1.m_dRaggio - c2.m_dRaggio;
    return new CCerchio(dSumRaggio);
  }
}

public class Corso
{
  static void Main(string[] args)
  {
    CCerchio c1 = new CCerchio(12.76);
    CCerchio c2 = new CCerchio();
    c2.Area = 762.2;
    Console.WriteLine("La circonferenza del cerchio di raggio
	   {0,0:n} è di {1,0:n}", c1.Raggio, c1.Circonferenza);
    Console.WriteLine("La circonferenza del cerchio di raggio
	   {0,0:n} è di {1,0:n}", c2.Raggio, c2.Circonferenza);
    Console.WriteLine("Il raggio risultante dal cerchio di raggio
	   {0,0:n} e raggio {1,0:n} è {2,0:n}", c1.Raggio,
	   c2.Raggio, (c1+c2).Raggio);
    Console.WriteLine("La circonferenza risultante dal cerchio di raggio
	   {0,0:n} e raggio {1,0:n} è {2,0:n}", c1.Raggio, c2.Raggio,
	   (c1+c2).Circonferenza);
    Console.WriteLine("L'area risultante dal cerchio di raggio
	   {0,0:n} e raggio {1,0:n} è {2,0:n}", c1.Raggio, c2.Raggio,
	   (c1+c2).Area);

	Console.ReadKey();
  }
}

Come si vede da questo esempio l’overloading degli operatori si definisce con una semplice funzione pubblica e statica e nel nostro caso ritorna un nuovo oggetto di tipo cerchio, ma poteva ritornare altri tipi. Notate da subito la potenza di un simile approccio! Poter avere un risultato per ogni nostro oggetto tramite dei semplici operatori, quindi il codice risulta chiaro e concentrato. Parleremo delle funzioni statiche nella prossima lezione, ma dovete solo sapere che sono dei metodi o anche proprietà che risiedono in memoria per tutto il corso del programma e quindi si possono richiamare senza bisogno di istanziare l’oggetto, ma ovviamente occorre farne un uso equilibrato per non occupare troppa memoria RAM del computer.

<< Lezione Precedente – Inizio CorsoIndice LezioniLezione Successiva >>

Di Giampaolo Rossi

Sviluppatore software da oltre 16 anni.