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显式接口成员实现)规范,有两个原因.
它没有说明为什么你不能使这些方法虚拟.
更新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)
但是这样我真的没有迹象表明我压倒了什么
嗯,你这样做 - 你有一个事实,它显然是一个明确的接口实现.这表明它为在接口上指定的方法调用提供了多态行为...为什么基类是否也实现了接口?阅读代码时,它会给你带来什么不同?
对我来说,陈述的主要好处override
是确保我确实得到了正确的签名 - 它与我试图覆盖的东西相匹配.你已经通过显式接口实现获得了这样的好处,就好像你提供了一个不存在的方法或错误的参数等,编译器已经会抱怨.
我可以排序的看到你的观点,但我从来没有发现这是一个实际问题.
归档时间: |
|
查看次数: |
5273 次 |
最近记录: |