异常调用base.base.method()
从基础结构派生类时,base关键字允许访问直接父类中定义的成员。但是,在特殊情况下,可能需要从继承层次结构中更上层的类中调用方法。
考虑提供的代码场景,其中 Derived 覆盖 Say() Base 的 方法。在 SpecialDerived 中,Say() 的后续重写调用 base.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."); } }
、Derived 可以处理所需的行为而不影响其他派生类。
替代方案反射方法在无法修改继承结构的场景下,可以采用基于反射的方法,如下所示:
这种方法利用反射来动态检索来自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中文网其他相关文章!