Non, vous ne pouvez pas remplacer une non-méthode virtuelle. La chose la plus proche que vous pouvez faire est de cacher la méthode en créant un new
méthode avec le même nom, mais ce n'est pas conseillé car il casse les bons principes de conception.
Mais même en cachant la méthode ne vais pas vous donner le temps d'exécution polymorphes envoi des appels de méthode comme une véritable méthode virtuelle appel. Considérons 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 d'impression Foo.M
. Comme vous pouvez le voir, cette approche ne permet pas d'avoir une nouvelle mise en œuvre d'une méthode pour aussi longtemps que la référence à cet objet est le bon type dérivé mais qui cache une méthode de base ne pause le polymorphisme.
Je vous recommande de ne pas masquer les méthodes de base de cette manière.
J'ai tendance à côte avec ceux qui favorisent C#par défaut de comportement que les méthodes sont non-virtuel par défaut (contrairement à Java). J'irai même plus loin et dire que les classes doivent également être scellés par défaut. L'héritage est dur à concevoir pour correctement et le fait qu'il existe une méthode qui n'est pas marqué pour être virtuel indique que l'auteur de cette méthode n'a jamais prévu pour que la méthode puisse être substituée.
Edit: "les temps d'exécution des polymorphes envoi":
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. Par exemple, disons que dans mon exemple de code précédent, plutôt que de définir une non-méthode virtuelle, je n'ai en fait de définir une méthode virtuelle et une véritable méthode de remplacement ainsi.
Si je devais faire appel b.Foo
dans ce cas, le CLR serait de déterminer correctement le type d'objet que l' b
de points de référence pour qu' Bar
et l'envoi de l'appel à M
de façon appropriée.