如何在呼叫基本方法時避免中間覆蓋
在處理多個層級的類別層次結構時,可能會遇到您想要的情況從重寫方法呼叫基底方法,但您不想呼叫中間類別的實作。本文將探討如何在 C# 中實現此目的。
在提供的程式碼片段中,您有一個帶有虛擬方法 Say() 的基底類別。衍生類別重寫此方法,而 SpecialDerived 進一步重寫它。當為 SpecialDerived 的實例呼叫 sd.Say() 時,您會注意到不僅呼叫了您自己的實現,而且還呼叫了 Derived 的實作。
為了防止呼叫 Derived 的實現,您不能使用 base.base。說()。相反,您有兩個選擇:
選項1:將常用實作移至受保護的虛擬方法
如果您有應由多個衍生共享的常用實作類,將它們移到基類中受保護的虛擬方法。這允許其他類別僅重寫它們需要的實現,從而避免呼叫中間類別的實現。
例如,您可以引入受保護的虛擬方法 CustomSay(),而不是 Derived 重寫 Say():
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."); } }
選項2:直接函數指標呼叫(不安全Approach)
作為替代方案,您可以使用不安全程式碼區塊直接呼叫基類方法的函數指標。不建議這種方法,因為它被認為是不安全的,並且可能導致潛在的錯誤。
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中文網其他相關文章!