Appel de base.base.method()
Dans ce code, nous avons une hiérarchie de classes où SpecialDerived hérite de Derived, qui à son tour hérite de Base. Chaque classe a une méthode Say() remplacée qui imprime un message indiquant de quelle classe elle a été appelée.
Lorsque sd.Say() est appelé dans la méthode Main(), nous attendons le résultat suivant :
Called from Special Derived. Called from Derived. Called from Base.
Cependant, la sortie réelle inclut un appel inattendu à Derived.Say().
Pour éviter cela, nous pouvons modifier la classe SpecialDerived pour utiliser la méthode CustomSay() au lieu de remplacer Say(). De cette façon, seule la méthode CustomSay() est appelée lorsque sd.Say() est invoquée :
class SpecialDerived : Derived { protected override void CustomSay() { Console.WriteLine("Called from Special Derived."); } }
Une autre alternative, discutée dans une réponse séparée, consiste à accéder directement à la méthode Say() de Base en utilisant réflexion :
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(); } }
Bien que cette approche soit techniquement possible, elle n'est pas recommandée car elle est considérée comme une mauvaise pratique.
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!