異常調用base.base.method()
從基礎結構派生類別時,base關鍵字允許存取直接父類別中定義的成員。但是,在特殊情況下,可能需要從繼承層次結構中更上層的類別中呼叫方法。
考慮提供的程式碼場景,其中 Derived 覆蓋 Say() Base 的 方法。在SpecialDerived 中,Say() 的後續重寫呼叫base.Say(),打算從Say(),打算從Say() >基礎
。預期與實際實際行為
預期輸出為:Called from Special Derived. Called from Base.
但是,由於方法重寫的性質,實際輸出包括對Say()來自派生:
Called from Special Derived. Called from Derived. Called from Base.
解決問題
由於直接呼叫base.base.method()是不支持,則需要替代方法。 SpecialDerived 中提供的更新實作示範了這一點:
class SpecialDerived : Derived { public override void Say() { Console.WriteLine("Called from Special Derived."); CustomSay(); // Calls CustomSay() from Derived instead of Say() base.Say(); } protected virtual void CustomSay() { Console.WriteLine("Called from 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(); } }
的Say()方法並直接執行它,繞過標準方法解析過程。
以上是如何從已重寫的衍生類別呼叫基底類別方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!