首页 >后端开发 >C++ >为什么在 C# 继承中调用 `base.base.method()` 会产生意外结果,如何避免?

为什么在 C# 继承中调用 `base.base.method()` 会产生意外结果,如何避免?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-28 04:38:09617浏览

Why Does Calling `base.base.method()` Produce Unexpected Results in C# Inheritance, and How Can It Be Avoided?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn