Non, vous ne pouvez pas remplacer une méthode non virtuelle. La chose la plus proche que vous pouvez faire est de cacher la méthode en créant une new
méthode avec le même nom, mais ce n'est pas conseillé car cela enfreint les bons principes de conception.
Mais même le fait de cacher une méthode ne vous donnera pas le temps d'exécution d'une distribution polymorphe des appels de méthode comme le ferait un véritable appel de méthode virtuelle. Prenons cet exemple:
using System;
class Example
{
static void Main()
{
Foo f = new Foo();
f.M();
Foo b = new Bar();
b.M();
}
}
class Foo
{
public void M()
{
Console.WriteLine("Foo.M");
}
}
class Bar : Foo
{
public new void M()
{
Console.WriteLine("Bar.M");
}
}
Dans cet exemple, les deux appels à la M
méthode print Foo.M
. Comme vous pouvez le voir cette approche ne vous permet d'avoir une nouvelle mise en œuvre d'une méthode aussi longtemps que la référence à cet objet est du type dérivé correct , mais cachant une méthode de base ne polymorphisme de rupture.
Je vous recommande de ne pas masquer les méthodes de base de cette manière.
J'ai tendance à me rallier à ceux qui favorisent le comportement par défaut de C # selon lequel les méthodes ne sont pas virtuelles par défaut (par opposition à Java). J'irais même plus loin et dire que les classes devraient également être scellées par défaut. L'héritage est difficile à concevoir correctement et le fait qu'il existe une méthode qui n'est pas marquée comme virtuelle indique que l'auteur de cette méthode n'a jamais eu l'intention de remplacer la méthode.
Edit: "expédition polymorphe du temps d'exécution" :
Ce que je veux dire par là, c'est le comportement par défaut qui se produit au moment de l'exécution lorsque vous appelez des méthodes virtuelles. Disons par exemple que dans mon exemple de code précédent, plutôt que de définir une méthode non virtuelle, j'ai en fait défini une méthode virtuelle et une véritable méthode surchargée.
Si je devais appeler b.Foo
dans ce cas, le CLR déterminerait correctement le type d'objet vers lequel la b
référence pointe Bar
et enverrait l'appel de M
manière appropriée.