Explorer les méthodes virtuelles et abstraites en C #

Le langage de programmation C # prend en charge les méthodes virtuelles et abstraites, chacune présentant des avantages distincts. Vous utilisez des méthodes virtuelles pour implémenter une liaison tardive, tandis que les méthodes abstraites vous permettent de forcer les sous-classes du type à avoir la méthode explicitement remplacée. Dans cet article, je présenterai une discussion sur les méthodes virtuelles et abstraites et quand elles devraient être utilisées.

Une méthode virtuelle est une méthode déclarée virtuelle dans la classe de base. Une méthode est déclarée virtuelle en spécifiant le mot clé "virtual" dans la signature de la méthode. Une méthode virtuelle peut ou non avoir un type de retour. Les méthodes virtuelles permettent aux sous-classes du type de remplacer la méthode. Ils sont utilisés pour implémenter le polymorphisme d'exécution ou la liaison tardive. Il convient de noter que les membres virtuels ou abstraits d'une classe ne peuvent pas être déclarés comme privés. De plus, vous pouvez avoir une implémentation dans une méthode virtuelle, c'est-à-dire que les méthodes virtuelles peuvent avoir des implémentations en elles. Ces implémentations peuvent être remplacées par les sous-classes du type dans lequel la méthode virtuelle a été définie.

MSDN déclare: «Le mot clé virtuel est utilisé pour modifier une méthode, une propriété, un indexeur ou une déclaration d'événement et lui permettre d'être remplacé dans une classe dérivée».

Examinons maintenant du code pour une meilleure clarté sur la façon dont les méthodes virtuelles sont utilisées. Reportez-vous à l'extrait de code ci-dessous.

public class Base

{

public virtual void Test()

{

Console.WriteLine("This is the base version of the virtual method");

}

}

public class Derived : Base

{

public override void Test()

{

Console.WriteLine("This is the derived version of the virtual method");

}

}

La méthode Test () est déclarée comme virtuelle dans la classe Base et est remplacée dans la classe Derived. Notez comment le mot clé virtual est utilisé pour déclarer la méthode comme virtuelle dans la classe Base. Le mot clé virtual n'est pas nécessaire lorsque vous remplacez la méthode virtuelle dans la classe Derived.

Maintenant, reportez-vous à l'extrait de code donné ci-après qui illustre comment les méthodes virtuelles sont appelées.

class Program

{

static void Main()

{

Base baseObj1 = new Base();

baseObj1.Test();

Base baseObj2 = new Derived();

baseObj2.Test();

}

}

Notez que deux instances de la classe Base sont créées - baseObj1 et baseObj2. Dans le premier cas, l'objet de référence nommé baseObj1 fait référence à une instance de la classe Base. Dans le second cas, l'objet de référence nommé baseObj2 fait référence à une instance de la classe Derived. Lorsque vous exécutez le code, le premier appel à la méthode virtuelle afficherait le message «Ceci est la version de base de la méthode virtuelle» dans la console. Dans le second cas, le message "Ceci est la version dérivée de la méthode virtuelle" serait affiché. Pourquoi cette différence?

Dans le premier cas, le type de l'objet de référence baseObj1 est considéré - comme il est de type Base, la version de base de la méthode virtuelle sera appelée. Dans le second cas, le contexte de l'objet de référence baseObj2 sera considéré et donc le résultat.

Les méthodes abstraites sont celles qui sont déclarées abstraites dans la classe de base et qui ne peuvent pas avoir d'implémentations en elles, c'est-à-dire qu'elles ne peuvent avoir aucune fonctionnalité en elles. Vous pouvez utiliser des méthodes abstraites lorsque vous souhaitez que la méthode soit remplacée de force dans les classes dérivées du type dans lequel la méthode abstraite a été définie. Ceci est appliqué au moment de la compilation par le compilateur. Donc, si vous avez déclaré une méthode comme abstraite en utilisant le modificateur abstrait dans une classe de base, les sous-classes de cette classe devraient implémenter la méthode abstraite, faute de quoi le compilateur afficherait une erreur indiquant que la classe dérivée n'a pas implémenté le résumé membre. En substance,une méthode abstraite est déclarée en utilisant le mot-clé abstract dans une classe de base abstraite et les sous-classes non abstraites de ce type doivent avoir leur propre implémentation de la méthode abstraite. Les méthodes abstraites sont également implicitement de nature virtuelle, mais vous ne pouvez pas utiliser le mot clé virtual lors de la déclaration d'une méthode abstraite. Il convient de noter que les méthodes abstraites ne peuvent être déclarées qu'à l'intérieur de classes abstraites.

Une utilisation typique d'une méthode abstraite consiste à forcer le remplacement des méthodes ToString () ou Equals (). L'extrait de code suivant illustre comment les méthodes abstraites sont déclarées dans une classe abstraite nommée EntityBase.

public abstract class EntityBase

{

public abstract override string ToString();

public abstract override bool Equals(object obj);

}

public class Customer : EntityBase

{

//Implementation code for the abstract methods

}

La classe EntityBase est le type de base pour toutes les entités - la classe d'entité Customer étend cette classe et fournit une implémentation pour les méthodes abstraites. En substance, toutes les classes d'entités fourniraient leur propre implémentation des méthodes ToString () et Equals (). Aucune implémentation par défaut pour ces méthodes n'est nécessaire dans la classe de base et elles sont donc marquées comme abstraites. Ainsi, le remplacement de méthode est appliqué en déclarant la méthode comme abstraite dans la classe de base nommée EntityBase.