如何调用显式接口实现的基类函数?代码场景解决方案问询
解决方案:保留A的显式接口实现,让B的代码正常运行
当然有办法解决这个问题!咱们先搞清楚为啥base.DoSomething()会编译失败:显式接口实现的成员是绑定到接口类型而非基类本身的,所以你没法直接用base关键字去调用它们。不过咱们有几种不用移除A的显式实现的方案:
方案一:在A中添加受保护的核心方法(推荐)
这种方法把接口实现的逻辑和类内部可复用的逻辑分离,既保留了A的显式接口实现,又让子类能方便地复用逻辑:
interface ISomethingDoer { void DoSomething(); } class A: ISomethingDoer { // 新增受保护方法封装核心业务逻辑 protected void DoSomethingCore() { Something.Do(); } // 原有的显式接口实现不变,转而调用核心方法 void ISomethingDoer.DoSomething() { DoSomethingCore(); } } class B: A, ISomethingDoer { void ISomethingDoer.DoSomething() { if (reason) { // 直接调用基类的受保护核心方法 DoSomethingCore(); } SomethingElse.Do(); } }
这种方式符合封装原则,后续如果A的逻辑需要修改,只需要改动DoSomethingCore,显式接口实现和子类调用都不用调整,维护性拉满。
方案二:将base转换为接口类型调用
如果你没法修改类A的代码(比如A是第三方库的类),可以通过将base强制转换为ISomethingDoer接口类型来调用其显式实现:
interface ISomethingDoer { void DoSomething(); } class A: ISomethingDoer { void ISomethingDoer.DoSomething() { Something.Do(); } } class B: A, ISomethingDoer { void ISomethingDoer.DoSomething() { if (reason) { // 把base转成接口类型,调用A的显式实现 ((ISomethingDoer)base).DoSomething(); } SomethingElse.Do(); } }
这里的原理是:显式接口实现的成员只能通过接口引用访问,转换后就能触发A中实现的版本。只要A确实实现了ISomethingDoer(这个场景里是肯定的),就不会有运行时问题。
内容的提问来源于stack exchange,提问作者Mason Wheeler
相关产品推荐
相关产品推荐

