Appel de base.base.method() Exceptionnellement
Lors de la dérivation de classes à partir d'une structure de base, le mot-clé base permet l'accès aux membres définis dans la classe parent immédiate. Cependant, dans des situations exceptionnelles, il peut s'avérer nécessaire d'invoquer des méthodes de classes situées plus haut dans la hiérarchie d'héritage.
Considérez le scénario de code fourni, où Derived remplace Say() méthode de Base. Dans SpecialDerived, un remplacement ultérieur de Say() appelle base.Say(), dans l'intention d'exécuter Say() à partir de Base.
Attendu vs réel Comportement
Le résultat attendu est :
Called from Special Derived. Called from Base.
Cependant, en raison de la nature du remplacement de méthode, le résultat réel inclut un appel inattendu à Say() de Dérivé :
Called from Special Derived. Called from Derived. Called from Base.
Répondre au Problème
Étant donné que l'invocation directe de base.base.method() n'est pas prise en charge, une approche alternative est nécessaire. L'implémentation mise à jour fournie dans SpecialDerived démontre ceci :
class SpecialDerived : Derived { public override void Say() { Console.WriteLine("Called from Special Derived."); CustomSay(); // Calls CustomSay() from Derived instead of Say() base.Say(); } protected virtual void CustomSay() { Console.WriteLine("Called from Derived."); } }
En définissant une méthode virtuelle protégée supplémentaire, CustomSay(), Derived peut gérer le comportement souhaité sans affecter les autres classes dérivées.
Réflexion alternative Approche
Dans les scénarios où la modification de la structure d'héritage n'est pas réalisable, une approche basée sur la réflexion peut être utilisée comme indiqué ci-dessous :
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(); } }
Cette approche utilise la réflexion pour récupérer dynamiquement le Say() depuis Base et exécutez-la directement, en contournant la résolution de méthode standard processus.
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!