Sono andato a trovare i suoceri ad Ancona, e andando in 
stazione ho visto in edicola la guida su C# di "ioProgrammo": visto che mi 
aspettavano 5 ore di treno e non avevo con me il portatile ho deciso di fare 
questo investimento e comprarlo, per vedere se per caso c'era qualcosa di 
interessante.
L'introduzione non promette nulla di buona per uno che sviluppa in C# da 3 
anni:
"Se siete programmatori C#, e siete già produttivi, questo libro non vi serve 
a niente. Perchè non avete comprato la rivista senza libro?" 
Comunque, dopo le 5 ore di treno mi sono dovuto ricredere, ho scoperto 
parecchie cose che non conoscevo su C#, come la possibiltà di create di 
overloadare (ovviamente nelle proprie classi) i metodi di 
cast, sia implicito che esplicito, nella stessa maniera nella quale si possono 
overloadare gli operatori aritmetici e booleani.
Ovviamente, come ogni buon libro di programmazione, fa sorgere i suoi dubbi, 
e in particolare a me è sono sorto questo:
  - a cosa serve la keyword new 
  quando si parla di polimorfismo?
 
new
Per ridefinire un metodo di una classe nella sua classe figlia si usa virtual nel 
padre e override nel 
figlio, però si può anche mettere la keyword new nella 
classe figlio omettendo la virtual.
Leggendo sul libro scopro che in realtà non sono la stessa cosa:
Ipotizziamo di avere due classi, Parete 
e CascataDiGhiaccio, dove CascataDiGhiaccio eretida da 
Parete, e il metodo Sosta.
public Parete {
    public virtual String Sosta() {
        return "Sosta Generica";
    }
}
public CascataDiGhiaccio: Parete {
    
    // Caso 1
    public override String Sosta() {
        return "Sosta con chiodi da ghiaccio";
    }
    // Caso 2
    public new String Sosta() {
        return "Sosta con chiodi da ghiaccio";
    }
    
}
//Caso 1
Parete parete = new CascataDiGhiaccio();
parete.Sosta(); //risultato "Sosta con chiodi da ghiaccio"
//Caso 2
Parete parete = new CascataDiGhiaccio();
parete.Sosta(); //risultato "Sosta Generica"
Come si vede dal codice sopra, usando il la coppia virtual/override si 
ottiene l'esecuzione sempre del metodo della classe derivata, mentre usando 
new ho 
l'esecuzione del metodo della classe del tipo di dato usato al momento (nel 
nostro caso Parete).
Visto che in genere si usa il polimorfismo per poter usare la caretteristiche 
specifiche delle classi figlie, che senso ha usare new, 
che nella modalità solita di utlizzo invece causa sempre l'esecuzione della 
classe padre?
powered by IMHO