Maison > développement back-end > C++ > Pourquoi l'appel de `base.base.method()` produit-il des résultats inattendus dans l'héritage C# et comment peut-il être évité ?

Pourquoi l'appel de `base.base.method()` produit-il des résultats inattendus dans l'héritage C# et comment peut-il être évité ?

Mary-Kate Olsen
Libérer: 2024-12-28 04:38:09
original
639 Les gens l'ont consulté

Why Does Calling `base.base.method()` Produce Unexpected Results in C# Inheritance, and How Can It Be Avoided?

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.
Copier après la connexion

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.");
    }
}
Copier après la connexion

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();
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal