233 votes

Différence entre les méthodes virtuelles et abstraites

Voici un extrait du code de MSDN :

// compile 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 ?

535voto

Dennisch Points 539

Les méthodes virtuelles ont une implémentation et offrent aux classes dérivées la possibilité 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 surcharger la méthode. Les méthodes virtuelles peuvent contenir 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 en utilisant l'attribut 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.
    }
}

87voto

aizaz Points 841

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.
  • Une méthode abstraite doit être surchargée dans une classe enfant non abstraite.

Méthode virtuelle

  • Les méthodes virtuelles peuvent résider dans des classes abstraites et non abstraites.
  • Il n'est pas nécessaire de surcharger une méthode virtuelle dans un dérivé, mais cela peut l'être.
  • Une méthode virtuelle doit avoir un corps ..... Elle peut être remplacée par le mot clé "override" ......

17voto

Zubair Saif Points 393

Méthode abstraite :

  • Si une méthode abstraite est définie dans une classe, alors la classe doit être déclarée comme une 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/implémentation.

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

Méthode virtuelle :

  • Les méthodes virtuelles peuvent être surmontées dans la classe dérivée mais pas obligatoire.
  • Les méthodes virtuelles doivent avoir le corps de la méthode/implémentation en même temps que le nom 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;
            }
        }

6voto

user4230113 Points 61

Une méthode abstraite doit être surchargée dans une classe dérivée, sinon cela donnera une erreur de compilation. et dans les classes virtuelles, vous pouvez surcharger ou non, cela dépend si c'est assez bon, utilisez-le.

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");
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X