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

the*_*kip 13 c# compiler-construction interface explicit-interface

为了记录,我已经看过这个连接项,但我真的不明白支持这个问题会是什么.

说我有以下代码:

public interface IInterface
{
    void Method();
}

public class Base : IInterface
{
    virtual void IInterface.Method()
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

虚拟标识符有什么问题?使用虚拟修饰符可以override指示基类中有不同的实现.我现在可以通过删除虚方法并像这样创建派生类来使其工作:

public class Derived : IInterface
{
    void IInterface.Method()
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这样我真的没有迹象表明我压倒了什么.

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

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

它没有说明为什么你不能使这些方法虚拟.

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

ale*_*exm 14

显式实现接口的方法具有特殊的可见范围=除非将"this"转换为目标接口类型,否则无法从其他方法访问它.我想这就是为什么不支持虚拟说明符的原因 - 你不能覆盖不属于普通对象接口(private/protected/public)的方法.

这是我的解决方法:

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

   }

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


 public class Derived : Base
 {
     protected override void Method()
     {
     }
 }
Run Code Online (Sandbox Code Playgroud)

  • 从"Base"派生的所有类都是IInterface类型,您只能替换实现. (3认同)
  • 如果它被声明为"受保护",则只有派生类才会看到它.因此,您拥有私有接口实现和派生类的可扩展性 (2认同)

Jon*_*eet 7

但是这样我真的没有迹象表明我压倒了什么

嗯,你这样做 - 你有一个事实,它显然是一个明确的接口实现.这表明它为在接口上指定的方法调用提供了多态行为...为什么基类是否实现了接口?阅读代码时,它会给你带来什么不同?

对我来说,陈述的主要好处override是确保我确实得到了正确的签名 - 它与我试图覆盖的东西相匹配.你已经通过显式接口实现获得了这样的好处,就好像你提供了一个不存在的方法或错误的参数等,编译器已经会抱怨.

我可以排序的看到你的观点,但我从来没有发现这是一个实际问题.

  • @thekip:"把我的基础投入到IInterface"是什么意思?你所拥有的就是"这个",如果你把*引用给`IInterface`,你最终会再次打电话给自己.(如果你有办法调用基础实现,我有兴趣看到它.) (2认同)