méthodes virtuelles

Si j’ai une classe nommée "Parent" par exemple. il a une méthode nommée "Print". la classe "Kid" est dérivée, elle a une méthode nommée "Print" , mais une nouvelle.

 new public void Print; 

Créons un object:

 Parent p = new Kid(); 

Si j’utilise la méthode Print avec le pointeur de cet object, la méthode sera celle du père (“Parent”) et non la méthode “Kid”.

Mais lorsque j’utilise une méthode virtuelle, la méthode sera celle de l’enfant, pas celle du parent (si l’impression était virtuelle, l’impression dans “Kid” remplace la méthode “).

Pourquoi?

Vous n’écrivez pas la méthode dans votre classe d’inheritance, vous l’ observez .

Au lieu de:

 public new void Print(); 

Utilisation:

 public override void Print(); 

Lorsque vous utilisez le nouveau mot-clé avec une méthode ayant la même signature que celle d’une méthode parent, la méthode parent est ombrée. L’observation est différente de la priorité. Shadowing signifie que votre nouvelle méthode sera appelée si l’instance et la variable sont de type enfant. Tandis que surcharger garantit que votre méthode overriden sera appelée, peu importe que la variable soit de type enfant ou parent.

Modifier:

Consultez la fiche de comparaison sur MSDN.

Je ne suis pas vraiment sûr de ce que vous demandez, mais cet article fournit une excellente couverture du polymporphisme en C #.

Un appel de méthode virtuelle utilise le type réel de l’object pour déterminer la méthode à appeler, tandis qu’une méthode non virtuelle utilise le type de la référence.

Dis que tu as:

 public class Parent { public void NonVirtualPrint() {} public virtual void VirtualPrint() {} } public class Kid : Parent { public new void NonVirtualPrint() {} override public void VirtualPrint() {} } 

Ensuite:

 Parent p = new Parent(); Parent x = new Kid(); Kid k = new Kid(); p.NonVirtualPrint(); // calls the method in Parent p.VirtualPrint(); // calls the method in Parent x.NonVirtualPrint(); // calls the method in Parent x.VirtualPrint(); // calls the method in Kid k.NonVirtualPrint(); // calls the method in Kid k.VirtualPrint(); // calls the method in Kid