Comment éviter le remplacement intermédiaire lors de l'appel de méthodes de base
Lorsque vous travaillez avec plusieurs niveaux de hiérarchie de classes, il est possible de rencontrer des situations où vous souhaitez pour appeler une méthode de base à partir d'une méthode de substitution, mais vous ne souhaitez pas invoquer l'implémentation de la classe intermédiaire. Cet article explique comment y parvenir en C#.
Dans l'extrait de code fourni, vous disposez d'une classe de base avec une méthode virtuelle Say(). La classe dérivée remplace cette méthode, tandis que SpecialDerived la remplace davantage. Lorsque vous appelez sd.Say() pour une instance de SpecialDerived, vous remarquez que non seulement votre propre implémentation est invoquée, mais également celle de Derived.
Pour empêcher l'appel de l'implémentation de Derived, vous ne pouvez pas utiliser base.base. Dire(). Au lieu de cela, vous disposez de deux options :
Option 1 : Déplacer les implémentations couramment utilisées vers une méthode virtuelle protégée
Si vous avez des implémentations couramment utilisées qui doivent être partagées par plusieurs méthodes dérivées classes, déplacez-les vers une méthode virtuelle protégée dans la classe de base. Cela permet aux autres classes de remplacer uniquement l'implémentation dont elles ont besoin, évitant ainsi d'appeler l'implémentation de la classe intermédiaire.
Par exemple, au lieu de Derived remplaçant Say(), vous pouvez introduire une méthode virtuelle protégée CustomSay() :
class Base { public virtual void Say() { Console.WriteLine("Called from Base."); } } class Derived : Base { public override void Say() { CustomSay(); base.Say(); } protected virtual void CustomSay() { Console.WriteLine("Called from Derived."); } } class SpecialDerived : Derived { protected override void CustomSay() { Console.WriteLine("Called from Special Derived."); } }
Option 2 : Invocation directe du pointeur de fonction (approche non sécurisée)
En tant que Alternativement, vous pouvez utiliser le bloc de code non sécurisé pour appeler directement le pointeur de fonction pour la méthode de la classe de base. Cette approche n'est pas recommandée car elle est considérée comme dangereuse et peut conduire à des erreurs potentielles.
class SpecialDerived : Derived { public override void Say() { Console.WriteLine("Called from Special Derived."); var ptr = typeof(Base).GetMethod("Say").MethodHandle.GetFunctionPointer(); var baseSay = (Action)Activator.CreateInstance(typeof(Action), this, ptr); baseSay(); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!