Middle
Quelle est la différence entre la redéfinition et la dissimulation de méthodes en C#?
sobes.tech IA
Réponse de l'IA
La redéfinition (override) est utilisée pour implémenter le polymorphisme, permettant à la classe dérivée de fournir sa propre implémentation d'une méthode virtuelle, abstraite ou héritée. Le mot-clé virtual dans la classe de base et override dans la classe dérivée sont obligatoires.
La dissimulation (hiding, shadowing) se fait par une méthode portant le même nom dans la classe dérivée qui masque la méthode de la classe de base. La méthode de la classe de base est conservée, mais l'accès à celle-ci depuis une instance de la classe dérivée se fait par un cast explicite ou le mot-clé base. Le mot-clé new est utilisé dans la classe dérivée.
| Caractéristique | Redéfinition (Override) | Dissimulation (Hiding) |
|---|---|---|
| Mot-clé | virtual (base), override (dérivée) |
new (dérivée) |
| Polymorphisme | Oui, l'implémentation de la classe dérivée est appelée | Non, l'implémentation dépend du type de référence |
| Appel par référence de type base | La méthode redéfinie de la dérivée est appelée | La méthode de la classe de base est appelée |
| Accès à la méthode de la classe de base | Via base.MethodName() |
Via base.MethodName() ou cast de type |
public class BaseClass
{
public virtual void ShowMessage() // Méthode virtuelle à redéfinir
{
Console.WriteLine("Message de BaseClass (virtuel).");
}
public void DisplayInfo() // Méthode pour dissimuler
{
Console.WriteLine("Info de BaseClass.");
}
}
public class DerivedClass : BaseClass
{
public override void ShowMessage() // Redéfinition de la méthode virtuelle
{
Console.WriteLine("Message de DerivedClass (override).");
}
public new void DisplayInfo() // Dissimulation de la méthode
{
Console.WriteLine("Info de DerivedClass (new).");
}
}
public class Program
{
public static void Main(string[] args)
{
BaseClass baseObj = new BaseClass();
DerivedClass derivedObj = new DerivedClass();
BaseClass derivedAsBase = new DerivedClass(); // Référence de type base à un objet dérivé
baseObj.ShowMessage(); // Affiche : Message de BaseClass (virtuel).
baseObj.DisplayInfo(); // Affiche : Info de BaseClass.
derivedObj.ShowMessage(); // Affiche : Message de DerivedClass (override).
derivedObj.DisplayInfo(); // Affiche : Info de DerivedClass (new).
derivedAsBase.ShowMessage(); // Affiche : Message de DerivedClass (override). (Polymorphisme en action)
derivedAsBase.DisplayInfo(); // Affiche : Info de BaseClass. (Méthode de BaseClass appelée en raison du type de référence)
}
}