How to: Overloading degli operatori

Scritto da  Antonio Pierascenzi il lunedì 18 ottobre 2010  •  Linguaggio: C#   • 


A volte si ha la necessità di ridefinire i comportamenti di una determinata operazione che il framework ci fornisce nativamente per le nostre classi, pensiamo ad esempio al metodo ToString()  che applicato a tutte le classi che costruiamo ci restituisce, se richiamato, la stringa contenente il nome del tipo creato.
Inoltre si potrebbe avere bisogno di sommare quantità, moltiplicarle, applicare comparazioni logiche, insomma cose che solitamente si hanno spesso a disposizione nativamente per gli oggetti definiti nel framework ma non a disposizione nei nostri oggetti, se non definendo noi metodi adatti allo scopo.
Un modo più elegante di ottenere lo scopo è tramite l'overloading degli operatori, funzionalità messa a disposizione degli sviluppatori C# fin dalla prima versione del framework.Come sempre un esempio è meglio di tante parole.
Supponiamo di avere una classe Position così definita:

public class Position
{
public double X, Y, Z;

public Position(double x, double y, double z)
{
X = x;
Y = y;
Z = z;
}
public Position(Position xyz)
{
X = xyz.X;
Y = xyz.Y;
Z = xyz.Z;
}

public override string ToString()
{
return "Valore x:" + X + "\n Valore y:" + Y + "\n Valore z:" + Z;
}

public static Position operator +(Position xyz, Position abc)
{
var newPosition = new Position(xyz);
newPosition.X += abc.X;
newPosition.Y += abc.Y;
newPosition.Z += abc.Z;
return newPosition;
}
}

 

Come si può vedere la sintassi dell'overloading degli operatori è simile alla definizione di un metodo pubblico statico con l'aggiunta della sola keyword "operator" che comunica al compilatore che si sta definendo l'overload  per un operatore, in questo caso "+".

Utilizzo:

Position pos1, pos2, pos3;
pos1 = new Position(3.0,4.0,5.0);
pos2 = new Position(2.0, 1.5, 2.5);
pos3 = pos1 + pos2;

Console.WriteLine("Position 1:\n" + pos1.ToString());
Console.WriteLine("Position 2:\n" + pos2.ToString());
Console.WriteLine("Position 3:\n" + pos3.ToString());

 

Come sempre per maggiori dettagli su quali operatori è possibile effettuare l'overload riferirsi alla  documentazione su MSDN.


Tags: Overloading,operatori

 
x