呼叫base.base.method()
在此程式碼中,我們有一個類別層次結構,其中SpecialDerived 繼承自Derived,而Derived 又繼承自Derived繼承自Base。每個類別都有一個重寫的 Say() 方法,該方法會列印一條訊息,指示從哪個類別呼叫它。
當在 Main() 方法中呼叫 sd.Say() 時,我們期望以下輸出:
Called from Special Derived. Called from Derived. Called from Base.
但是,實際輸出包括對 Derived.Say() 的意外呼叫。
為了防止這種情況,我們可以修改SpecialDerived 類別使用 CustomSay() 方法而不是重寫 Say()。這樣,當調用sd.Say() 時,僅調用CustomSay() 方法:
class SpecialDerived : Derived { protected override void CustomSay() { Console.WriteLine("Called from Special Derived."); } }
另一種替代方案(在單獨的答案中討論)是直接使用訪問Base 的Say() 方法反思:
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# 繼承中呼叫 `base.base.method()` 會產生意外結果,如何避免?的詳細內容。更多資訊請關注PHP中文網其他相關文章!