Maison >développement back-end >C++ >Comment appeler la méthode de classe de base d'une classe de base en C# ?

Comment appeler la méthode de classe de base d'une classe de base en C# ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-29 15:22:14783parcourir

How to Call a Base Class's Base Class Method in C#?

Appel de base.base.method():

Dans la programmation orientée objet, il est courant de créer des hiérarchies de classes avec des classes de base et dérivées cours. Lors du remplacement d'une méthode dans la classe dérivée, vous pouvez appeler l'implémentation de la classe de base à l'aide de base. Cependant, dans certains scénarios, vous pouvez rencontrer une situation dans laquelle vous souhaitez accéder à la classe de base de la classe de base.

Considérez l'exemple de code suivant :

class Base
{
    public virtual void Say()
    {
        Console.WriteLine("Called from Base.");
    }
}

class Derived : Base
{
    public override void Say()
    {
        Console.WriteLine("Called from Derived.");
        base.Say();
    }
}

class SpecialDerived : Derived
{
    public override void Say()
    {
        Console.WriteLine("Called from Special Derived.");
        base.Say();
    }
}

Lorsque vous appelez sd. Dites() pour une instance de SpecialDerived, vous attendez le résultat suivant :

Called from Special Derived.
Called from Derived.
Called from Base.

Cependant, vous get:

Called from Special Derived.
Called from Derived. /* this is not expected */
Called from Base.

L'appel inattendu à Derived.Say() est dû au fait que base fait toujours référence à la classe de base immédiate dans la hiérarchie. Par conséquent, SpecialDerived.Say() invoque Derived.Say() avant d'appeler Base.Say().

Pour éviter ce comportement, vous ne pouvez pas utiliser directement base.base.method(). Au lieu de cela, vous pouvez utiliser l'approche suivante :

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.");
    }
}

En introduisant la méthode intermédiaire CustomSay(), vous contrôlez ce qui est exécuté dans la chaîne d'appels de classe dérivée. Dans ce cas, SpecialDerived remplace CustomSay() pour fournir son propre comportement, ignorant ainsi Derived.CustomSay().

Vous pouvez également accéder au handle de la méthode de la classe de base en utilisant la réflexion et l'invoquer directement, 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();            
    }
}

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!

Déclaration:
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