Heim >Backend-Entwicklung >C++ >Wie verhindert man Methodenaufrufe von Zwischenklassen beim Überschreiben in C#?
So vermeiden Sie Zwischenüberschreibungen beim Aufrufen von Basismethoden
Wenn Sie mit mehreren Ebenen der Klassenhierarchie arbeiten, können Situationen auftreten, in denen Sie möchten Sie möchten eine Basismethode von einer überschreibenden Methode aufrufen, möchten aber nicht die Implementierung der Zwischenklasse aufrufen. In diesem Artikel erfahren Sie, wie Sie dies in C# erreichen.
Im bereitgestellten Codeausschnitt haben Sie eine Basisklasse mit einer virtuellen Methode Say(). Die abgeleitete Klasse überschreibt diese Methode, während SpecialDerived sie weiter überschreibt. Wenn Sie sd.Say() für eine Instanz von SpecialDerived aufrufen, stellen Sie fest, dass nicht nur Ihre eigene Implementierung aufgerufen wird, sondern auch die von Derived.
Um zu verhindern, dass die Implementierung von Derived aufgerufen wird, können Sie base.base nicht verwenden. Sagen(). Stattdessen haben Sie zwei Möglichkeiten:
Option 1: Häufig verwendete Implementierungen in eine geschützte virtuelle Methode verschieben
Wenn Sie häufig verwendete Implementierungen haben, die von mehreren abgeleiteten gemeinsam genutzt werden sollten Klassen, verschieben Sie sie in eine geschützte virtuelle Methode in der Basisklasse. Dies ermöglicht es anderen Klassen, nur die Implementierung zu überschreiben, die sie benötigen, und vermeidet den Aufruf der Implementierung der Zwischenklasse.
Anstatt beispielsweise durch Derived Say() zu überschreiben, können Sie eine geschützte virtuelle Methode CustomSay() einführen:
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."); } }
Option 2: Direkter Funktionszeigeraufruf (unsicherer Ansatz)
As Alternativ können Sie den unsicheren Codeblock verwenden, um den Funktionszeiger für die Methode der Basisklasse direkt aufzurufen. Dieser Ansatz wird nicht empfohlen, da er als unsicher gilt und zu potenziellen Fehlern führen kann.
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 verhindert man Methodenaufrufe von Zwischenklassen beim Überschreiben in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!