Différence entre les méthodes virtuelles et abstraites

Voici un code de MSDN :

// comstack with: /target:library public class D { public virtual void DoWork(int i) { // Original implementation. } } public abstract class E : D { public abstract override void DoWork(int i); } public class F : E { public override void DoWork(int i) { // New implementation. } } 

Quelqu’un peut-il expliquer le code ci-dessus en ce qui concerne les différences entre les méthodes abstraites et virtuelles?

Les méthodes virtuelles ont une implémentation et permettent aux classes dérivées de la remplacer. Les méthodes abstraites ne fournissent pas d’implémentation et obligent les classes dérivées à remplacer la méthode.

Ainsi, les méthodes abstraites ne contiennent pas de code réel, et les sous-classes DOIVENT remplacer la méthode. Les méthodes virtuelles peuvent avoir du code, qui est généralement une implémentation par défaut de quelque chose, et toutes les sous-classes peuvent remplacer la méthode à l’aide du modificateur override et fournir une implémentation personnalisée.

 public abstract class E { public abstract void AbstractMethod(int i); public virtual void VirtualMethod(int i) { // Default implementation which can be overridden by subclasses. } } public class D : E { public override void AbstractMethod(int i) { // You HAVE to override this method } public override void VirtualMethod(int i) { // You are allowed to override this method. } } 

Tout d’abord, vous devez connaître la différence entre une méthode virtuelle et une méthode abstraite.

Méthode abstraite

  • La méthode abstraite réside dans la classe abstraite et n’a pas de corps.
  • La méthode abstraite doit être remplacée dans la classe enfant non abstraite.

Méthode virtuelle

  • La méthode virtuelle peut résider dans une classe abstraite et non abstraite.
  • Il n’est pas nécessaire de remplacer la méthode virtuelle en dérivée mais cela peut être.
  • La méthode virtuelle doit avoir un corps …. peut être remplacé par “mot-clé prioritaire” …..

une méthode abstraite doit être remplacée par un appel dans une classe dérivée, sinon elle donnera une erreur de compilation et, en virtuel, vous pouvez ou non ne pas la modifier dépend si elle est suffisamment bonne

Exemple:

 abstract class twodshape { public abstract void area(); // no body in base class } class twodshape2 : twodshape { public virtual double area() { Console.WriteLine("AREA() may be or may not be override"); } } 

Méthode abstraite:

  • Si une méthode abstraite est définie dans une classe, alors la classe doit être déclarée en tant que classe abstraite.

  • Une méthode abstraite ne doit contenir que la définition de la méthode, ne doit pas contenir le corps de la méthode / l’implémentation.

  • Une méthode abstraite doit être dépassée dans la classe dérivée.

Méthode virtuelle:

  • Les méthodes virtuelles peuvent être dépassées dans la classe dérivée mais pas obligatoires.
  • Les méthodes virtuelles doivent avoir le corps / implémentation de la méthode avec la définition.

Exemple:

 public abstract class baseclass { public abstract decimal getarea(decimal Radius); public virtual decimal interestpermonth(decimal amount) { return amount*12/100; } public virtual decimal totalamount(decimal Amount,decimal principleAmount) { return Amount + principleAmount; } } public class derivedclass:baseclass { public override decimal getarea(decimal Radius) { return 2 * (22 / 7) * Radius; } public override decimal interestpermonth(decimal amount) { return amount * 14 / 100; } }