为什么可以覆盖显式实现?

时间:2017-09-05 12:10:45

标签: c# interface-implementation

当直接从实现者类访问接口成员时,我们通常会明确地实现接口。天气它必须是内部的,或者它会导致与API设计的冲突,或者当它增加误用方法的机会时。

在我的脑海中绝对不鼓励为具有不同逻辑的多个接口单独实现成员,所以这不是这里的情况

编译器不允许将此类实现作为虚拟,因为它没有意义,我认为这是正确的。通常,显式实现非常敏感,这就是您尝试隐藏它的原因。

然而,我发现了一种过度显式实施的方法(它不是完全覆盖,而是其作弊选择)

我发现这令人惊讶且非常令人失望。我的问题是为什么允许以下代码并且工作完美?我希望得到错误,该接口已经明确实现。

这只是重现问题的基本示例

docker-compose up

2 个答案:

答案 0 :(得分:2)




为什么允许使用以下代码并且工作正常?







因为规格如此说明:


& #xA;



显式接口成员实现包含访问修饰符是一个编译时错误,它是
编译时错误包括修饰符abstract,virtual,override或static。







然而在多态性中,俗话说 “更多派生类型知道更多”,再次从规范:







派生类可以扩展和专门化基类







因此,当您调用时,将显式调用实现该接口的派生类型最多的类型接口成员。




答案 1 :(得分:0)

我建议您考虑从C#到本地代码的低级转换:接口继承重新声明,以及其一个或多个方法覆盖,强制重写VMT - 虚方法表(接口方法是虚拟的设计)。