调用 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中文网其他相关文章!