VIRTUAL |
Virtuel |
|---|---|
| C# (C Sharp) | |
Syntaxe
|
function-specifier := virtual base-modifiers ::= virtual [access-specifier] | access-specifier [virtual] |
Paramètres
| Nom | Description |
|---|---|
| access-specifier | Ce paramètre permet d'indiquer le spécificateur d'accès |
| function-specifier | Ce paramètre permet d'indiquer le spécificateur de fonction. |
| base-modifiers | Ce paramètre permet d'indiquer le modificateur de base. |
Description
Ce mot réservé permet de définir une fonction pouvant être remplacer par une nouvelle fixation de classe.
Remarques
- Le mot clef virtual permet à une méthode d'être redéfinie dans une classe dérivée : Lorsqu'une méthode est marquée comme virtual, elle peut être surchargée dans une classe fille à l'aide du mot clef override. Cela favorise le polymorphisme, étant une pierre angulaire de la programmation orientée objet.
- Les méthodes virtuelles permettent de différer l'implémentation exacte jusqu'à l'exécution : Avec une méthode virtual, le comportement final dépend de l'instance réelle de l'objet, même si elle est référencée via un type de base. Cela permet une liaison dynamique (ou "late binding") essentielle à la flexibilité du code.
- Une méthode non marquée virtual ne peut pas être surchargée avec override : Si une méthode n'est pas déclarée comme virtual, toute tentative de la redéfinir dans une classe dérivée nécessitera new au lieu de override, ce qui signifie que la liaison statique sera utilisée au lieu de la liaison dynamique.
- Le mot clef virtual peut aussi s'appliquer aux propriétés, indexeurs et événements : Cela permet aux classes dérivées de personnaliser la logique de ces membres tout en conservant une interface commune. Ce comportement est particulièrement utile dans les modèles comme MVC, les moteurs de rendu ou la sérialisation.
- L'usage du mot clef virtual a un coût léger en performance : Comme il implique une résolution dynamique à l'exécution via une table virtuelle (vtable), il peut être moins performant que l'appel direct à une méthode non virtuelle. Cela reste cependant négligeable sauf dans des contextes très sensibles.
- Il est déconseillé d'utiliser virtual de manière excessive sans besoin clair : L'introduction de la virtualisation complique l'héritage, car elle ouvre la porte à des modifications comportementales inattendues dans les classes dérivées. Il faut bien réfléchir à l'architecture et à la nécessité réelle de polymorphisme.
- Une méthode virtual peut être redéfinie plusieurs fois dans une hiérarchie : Tant qu'une classe dérivée continue d'utiliser override, le comportement peut évoluer à chaque niveau d'héritage. On peut également empêcher toute redéfinition future avec le mot-clef sealed appliqué à une méthode override.
- Le mot clef virtual joue un rôle central dans les modèles de conception orientés objets : Des patterns comme Template Method, Strategy ou Visitor reposent sur la capacité de remplacer dynamiquement des comportements. Le virtual permet de construire des architectures plus souples et extensibles.
Exemple
Cet exemple permet de remplacer la méthode déclarer dans la classe parente :
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
-
- namespace VirtualSamples
- {
- class maclassA {
- public virtual char getValue() {
- return 'a';
- }
- };
-
- class maclassB : maclassA {
- public virtual char getValue() {
- return 'b';
- }
- };
-
- class Program
- {
- static void Main(string[] args)
- {
- maclassB a = new maclassB();
- Console.WriteLine("Valeur retourner = " + a.getValue());
- }
- }
-
on obtiendra le résultat suivant :
Valeur retourner = b
Dernière mise à jour : Mardi, le 26 janvier 2016