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