Heim >Backend-Entwicklung >C++ >Wie rufe ich die Basisklassenmethode einer Basisklasse in C# auf?

Wie rufe ich die Basisklassenmethode einer Basisklasse in C# auf?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-29 15:22:14773Durchsuche

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

Aufruf von base.base.method():

In der objektorientierten Programmierung ist es üblich, Klassenhierarchien mit Basis und Ableitung zu erstellen Klassen. Wenn Sie eine Methode in der abgeleiteten Klasse überschreiben, können Sie die Basisklassenimplementierung mit base aufrufen. In bestimmten Szenarien kann es jedoch vorkommen, dass Sie auf die Basisklasse der Basisklasse zugreifen möchten.

Betrachten Sie den folgenden Beispielcode:

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();
    }
}

Wenn Sie sd aufrufen. Sagen Sie() für eine Instanz von SpecialDerived, Sie erwarten die folgende Ausgabe:

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

Aber Sie tatsächlich get:

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

Der unerwartete Aufruf von Derived.Say() liegt daran, dass sich base immer auf die unmittelbare Basisklasse in der Hierarchie bezieht. Daher ruft SpecialDerived.Say() Derived.Say() auf, bevor Base.Say() aufgerufen wird.

Um dieses Verhalten zu vermeiden, können Sie base.base.method() nicht direkt verwenden. Stattdessen können Sie den folgenden Ansatz verwenden:

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

Durch die Einführung der Zwischenmethode CustomSay() haben Sie die Kontrolle darüber, was in der Aufrufkette der abgeleiteten Klasse ausgeführt wird. In diesem Fall überschreibt SpecialDerived CustomSay(), um sein eigenes Verhalten bereitzustellen, und überspringt effektiv Derived.CustomSay().

Alternativ können Sie mithilfe von Reflektion auf das Methodenhandle der Basisklasse zugreifen und es direkt aufrufen, wie unten gezeigt:

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();            
    }
}

Das obige ist der detaillierte Inhalt vonWie rufe ich die Basisklassenmethode einer Basisklasse in C# auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn