overloading di metodi

Definire più versioni di un metodo utilizzando lo stesso nome ma una firma diversa, cioé numero e/o il tipo di argomenti nella dichiarazione

sulla base degli argomenti effettivamente passati alla routine, verrà riconosciuta la firma e richiamato il metodo corretto

esempio: un metodo diverso a seconda del tipo di parametro passato
public static void Stampa(string Messaggio)
{

System.Console.WriteLine("Il messaggio è: " + Messaggio);
}

public static void Stampa(int Numero)
{
System.Console.WriteLine("Il numero è: " + Numero);
}



l'overloading viene spesso usato nella definizione del costruttore di una classe

esempio: doppio costruttore anche se non si passano parametri
public Persona() costruttore senza parametri
{

mNome = "Nessun nome";
mCognome = "Nessun cognome";
}

public Persona(string Nome, string Cognome) costruttore con parametri
{
mNome = Nome;
mCognome = Cognome;
}

esempio: quando un costruttore richiama un altro costruttore tramite this



overloading di operatori

é possibile ridefinire il comportamento dell'operatore a seconda degli oggetti applicati

sintassi: dichiarazione sempre static
modificatore_accesso static tipo_valore operator operatore(classe oggetto 1, classe oggetto 2)


a seconda dell'operatore va specificato anche quello inverso altrimenti il compilatore da errore: specifico == devo spcificare anche != ecc...

per gli operatori == e != va anche fatto overloading dei due metodi Object. Equals() e GetHashCode(), altrimenti il compilatore da un worning

esempio: confronto Nome e Cognome di due oggetti Persona
Persona p1 = new Persona("Donald", "Duck"); creazione oeggetto
Persona p2 = new Persona("Donald", "Duck");

public static bool operator == (Persona p1, Persona p2) overloading operatore ==
{

if (p1.Nome == p2.Nome && p1.Cognome == p2.Cognome) definito che deve essere usuale sia nome che cognome
return true;
return false;
}

public static bool operator != (Persona p1, Persona p2) overloading operatore !=
{
if (p1.Nome != p2.Nome || p1.Cognome != p2.Cognome) definito che deve essere diverso nome o il cognome
return true;
return false;
}