Méthode virtuelle appelée à partir de dérivé au lieu de base

Quelqu’un peut-il m’expliquer pourquoi la méthode surchargée est appelée lorsque je convertis la classe dans la base:

class Base { public virtual void VirtualMethod() { Console.WriteLine("Base virtual method"); } } sealed class Derived : Base { public override void VirtualMethod() { Console.WriteLine("Overriden method"); } } static void Main(Ssortingng[] args) { Derived d = new Derived(); ((Base)d).VirtualMethod(); } 

Je veux dire que ce code imprime:

 Overriden method 

et pas

 Base virtual method 

C’est un futur run-time ou comstack?

Je sais que je peux appeler la méthode virtuelle de la base en appelant base.VirtualMethod() mais puis-je l’appeler de l’extérieur? (comme de Main ou d’une autre classe)

L’implémentation de la méthode est choisie en fonction du type d’ exécution de l’object. C’est une grande partie de la question. Tout le monde peut utiliser:

 public void Foo(Base b) { b.VirtualMethod(); } 

… et n’avez pas besoin de savoir ou de se soucier du type d’exécution, car le polymorphism s’en chargera.

Je sais que je peux appeler la méthode virtuelle de la base en appelant base.VirtualMethod () mais puis-je l’appeler de l’extérieur?

Non (du moins, pas sans quelque horrible piratage pour appeler la méthode virtuelle de manière non virtuelle), et c’est une partie délibérée de l’encapsulation. L’implémentation de substitution a effectivement remplacé l’implémentation d’origine pour cet object.

Si vous souhaitez accéder à la mise en œuvre de base, vous ne devez pas utiliser de substitution, vous devez utiliser new. Le remplacement remplace toute implémentation parente, la nouvelle “masque” celle-ci afin que vous puissiez accéder à celle-ci en définissant l’object parent puis en invoquant la méthode.

 internal class Program { private static void Main(ssortingng[] args) { Derived d = new Derived(); d.VirtualMethod(); ((Base) d).VirtualMethod(); Console.ReadLine(); } private class Base { public virtual void VirtualMethod() { Console.WriteLine("Base virtual method"); } } private sealed class Derived : Base { public new void VirtualMethod() { Console.WriteLine("Overriden method"); } } } 

Cela produira:

Méthode Overriden
Méthode virtuelle de base