呼叫base.base.method():
在物件導向程式設計中,使用基底類別和衍生類別建立類別層次結構是常見的做法類。當重寫派生類別中的方法時,可以使用 base 呼叫基底類別實作。但是,在某些場景下,您可能會遇到想要存取基類的基類的情況。
考慮以下範例程式碼:
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(); } }
當您呼叫sd. Say() 對於SpecialDerived 的實例,您預期會得到以下輸出:
Called from Special Derived. Called from Derived. Called from Base.
但是,您實際上get:
Called from Special Derived. Called from Derived. /* this is not expected */ Called from Base.
對Derived.Say() 的意外呼叫是因為base 總是會引用層次結構中的直接基底類別。因此,SpecialDerived.Say() 在呼叫 Base.Say() 之前呼叫 Derived.Say()。
為了避免這種行為,不能直接使用 base.base.method()。相反,您可以使用以下方法:
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."); } }
透過引入中間方法 CustomSay(),您可以控制派生類別呼叫鏈中執行的內容。在這種情況下,SpecialDerived 重寫 CustomSay() 以提供自己的行為,有效地跳過 Derived.CustomSay()。
或者,您可以使用反射存取基類方法句柄並直接呼叫它,如下所示:
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(); } }
以上是如何在C#中呼叫基類的基類方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!