Heim >Backend-Entwicklung >C++ >Warum führt der Aufruf von „base.base.method()' zu unerwarteten Ergebnissen bei der C#-Vererbung und wie kann dies vermieden werden?

Warum führt der Aufruf von „base.base.method()' zu unerwarteten Ergebnissen bei der C#-Vererbung und wie kann dies vermieden werden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-28 04:38:09615Durchsuche

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

Aufruf von base.base.method()

In diesem Code haben wir eine Klassenhierarchie, in der SpecialDerived von Derived erbt, was wiederum derived erbt erbt von Base. Jede Klasse verfügt über eine überschriebene Say()-Methode, die eine Meldung ausgibt, die angibt, von welcher Klasse sie aufgerufen wurde.

Wenn sd.Say() in der Main()-Methode aufgerufen wird, erwarten wir die folgende Ausgabe:

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

Die tatsächliche Ausgabe enthält jedoch einen unerwarteten Aufruf von Derived.Say().

Um dies zu verhindern, können wir die zu verwendende SpecialDerived-Klasse ändern die CustomSay()-Methode verwenden, anstatt Say() zu überschreiben. Auf diese Weise wird nur die CustomSay()-Methode aufgerufen, wenn sd.Say() aufgerufen wird:

class SpecialDerived : Derived
{
    protected override void CustomSay()
    {
        Console.WriteLine("Called from Special Derived.");
    }
}

Eine weitere Alternative, die in einer separaten Antwort erläutert wird, besteht darin, direkt über auf die Say()-Methode von Base zuzugreifen Reflexion:

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

Obwohl dieser Ansatz technisch möglich ist, wird er nicht empfohlen, da er als schlechte Praxis gilt.

Das obige ist der detaillierte Inhalt vonWarum führt der Aufruf von „base.base.method()' zu unerwarteten Ergebnissen bei der C#-Vererbung und wie kann dies vermieden werden?. 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