作为记录,我已经看过这个连接项目 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 显式接口成员实现)规范,有两个原因。
- 隐藏某些方法(我正在使用它)。
- 有 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(使用前将#替换为@)