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?
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!