Être principalement un développeur Java, j'ai été un peu surpris par le résultat lorsque j'ai utilisé accidentellement un jour nouveau mot-clé au lieu de déroger.Quel est le cas d'utilisation de C# permettant d'utiliser new sur une méthode virtuelle?
Il semble que le nouveau mot-clé supprime la « virtualité » de la méthode à ce niveau dans l'arbre d'héritage, de sorte que l'appel d'une méthode sur une instance de classe enfant qui est downcasted à la classe parente, ne résoudra pas à l'implémentation de la méthode dans la classe enfant.
Quels sont les cas d'utilisation pratique de ce comportement? Clarification: Je comprends l'utilisation de nouveau lorsque le parent n'est pas virtuel. Je suis plus curieux de savoir pourquoi le compilateur permet de combiner nouveau et virtuel.
L'exemple suivant illustre la différence:
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();
}
}
Ceci produit la sortie suivante:
Calling FooBar:AAA
FooBar:AAA
Calling FooBar:CCC
Bar:CCC
Calling Bar:AAA
Bar:AAA
Calling Bar:CCC
Bar:CCC
Bon exemple. C'est une option très pratique, mais je dirais qu'il a assez d'embûches pour justifier un avertissement de compilation. – PeterR
Eh bien vous obtenez un avertissement de compilation si vous * n'avez pas * new' mais vous cachez une méthode. L'idée est que si vous ajoutez * explicitement * un modificateur, cela devrait être un signe que vous le pensez vraiment :) –