Maison > développement back-end > C++ > Comment empêcher les appels de méthodes de classe intermédiaire lors d'une substitution en C# ?

Comment empêcher les appels de méthodes de classe intermédiaire lors d'une substitution en C# ?

Patricia Arquette
Libérer: 2024-12-26 20:51:10
original
793 Les gens l'ont consulté

How to Prevent Intermediary Class Method Calls When Overriding in C#?

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

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

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