显式接口实现不能是虚拟的

2024-03-21

作为记录,我已经看过这个连接项目 https://connect.microsoft.com/VisualStudio/feedback/details/93163/allow-explicit-interface-implementations-to-be-virtual-and-to-be-called-from-derived-classes但我真的无法理解支持这一点会出现什么问题。

假设我有以下代码:

public interface IInterface
{
    void Method();
}

public class Base : IInterface
{
    virtual void IInterface.Method()
    {
        throw new NotImplementedException();
    }
}

虚拟标识符有什么问题?拥有虚拟修改器将可以override表明基类中有不同的实现。我现在可以通过删除虚拟方法并创建派生类来使其工作,如下所示:

public class Derived : IInterface
{
    void IInterface.Method()
    {
        throw new NotImplementedException();
    }
}

然而这样我真的没有任何迹象表明我正在重写某些东西。

Update:
根据 C#(部分:20.4.1 显式接口成员实现)规范,有两个原因。

  1. 隐藏某些方法(我正在使用它)。
  2. 有 2 个具有相同签名但返回类型不同的函数 (例如对于 ICloneable 很有用)。

然而,它没有说明为什么不能使这些方法虚拟化。

Update2:
鉴于答案,我认为我应该在这里重新表述真正的问题。如果以上两个原因是接口显式实现首先成为可能的原因。如果你将一个方法设为虚拟,为什么会出现问题呢?


显式实现接口的方法具有特殊的可见性范围=除非将“this”强制转换为目标接口类型,否则您无法从其他方法访问它。我想这就是不支持虚拟说明符的原因 - 您无法覆盖不属于普通对象接口(私有/受保护/公共)的方法。

这是我的解决方法:

public class Base : IInterface
{    
   protected virtual void Method()
   {

   }

   void IInterface.Method()    
   {        
       this.Method()
   }
 }


 public class Derived : Base
 {
     protected override void Method()
     {
     }
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

显式接口实现不能是虚拟的 的相关文章

随机推荐