Essendo principalmente uno sviluppatore Java, sono rimasto un po 'sorpreso dal risultato quando un giorno ho utilizzato per errore la nuova parola chiave anziché override.Qual è il caso d'uso per C# che consente di usare nuovo su un metodo virtuale?
Sembra che il nuovo parola chiave rimuove la "virtualità" del metodo a quel livello nella struttura di eredità, in modo che chiamando un metodo su un'istanza della classe figlia che è downcasted alla classe genitore, non risolverà all'implementazione del metodo nella classe figlio.
Quali sono i casi di utilizzo pratico di questo comportamento?
Precisazione: comprendo l'uso del nuovo quando genitore non è virtuale. Sono più curioso del perché il compilatore consenta di combinare nuovi e virtuali.
L'esempio seguente illustra la differenza:
using System;
public class FooBar
{
public virtual void AAA()
{
Console.WriteLine("FooBar:AAA");
}
public virtual void CCC()
{
Console.WriteLine("FooBar:CCC");
}
}
public class Bar : FooBar
{
public new void AAA()
{
Console.WriteLine("Bar:AAA");
}
public override void CCC()
{
Console.WriteLine("Bar:CCC");
}
}
public class TestClass
{
public static void Main()
{
FooBar a = new Bar();
Bar b = new Bar();
Console.WriteLine("Calling FooBar:AAA");
a.AAA();
Console.WriteLine("Calling FooBar:CCC");
a.CCC();
Console.WriteLine("Calling Bar:AAA");
b.AAA();
Console.WriteLine("Calling Bar:CCC");
b.CCC();
Console.ReadLine();
}
}
Questo produce il seguente output:
Calling FooBar:AAA
FooBar:AAA
Calling FooBar:CCC
Bar:CCC
Calling Bar:AAA
Bar:AAA
Calling Bar:CCC
Bar:CCC
Buon esempio. È un'opzione molto conveniente, ma direi che ha abbastanza insidie da giustificare un avviso di compilazione. – PeterR
Bene si ottiene un avviso di compilazione se * non * si ha 'new' ma si nasconde un metodo. L'idea è che se * esplicitamente * aggiungi un modificatore, questo dovrebbe essere un segnale che intendi davvero :) –