为什么可以覆盖显式实现?
Why its possible to override explicit implementation?
当直接从实现者那里访问接口成员是不对的时候,我们通常会显式地实现接口class。天气它必须是内部的,或者它会导致与 API 设计的冲突,或者当它增加滥用方法的机会时。
在我看来绝对不鼓励为具有不同逻辑的多个接口单独实现成员,所以这里不是这种情况
编译器不允许虚拟这样的实现,因为它没有意义,我认为这是正确的。通常显式实现是非常敏感的,这就是你试图隐藏它的原因。
但是我发现了以下覆盖显式实现的方法(它不完全是覆盖,而是作弊的替代方法)
我发现这令人惊讶且非常失望。我的问题是为什么允许使用以下代码并且可以完美运行?我预计会收到接口已明确实现的错误。
这只是重现问题的基本示例
static void Main(string[] args)
{
var b = new Base();
((IInterface)b).Write();
var c = new Child();
((IInterface)c).Write();
}
public interface IInterface
{
void Write();
}
public class Base : IInterface
{
void IInterface.Write()
{
Console.WriteLine("Base");
}
}
public class Child : Base, IInterface // hack is here. Re Implemented :/
{
void IInterface.Write()
{
Console.WriteLine("Child");
}
}
Outputs
Base
Child
我建议您考虑从 C# 到本机代码的低级别转换:接口继承重新声明及其一个或多个方法覆盖,强制重写 VMT - 虚拟方法 Table (接口方法在设计上是虚拟的。
why following code is allowed and works perfectly?
因为规格是这样说的:
It is a compile-time error for an explicit interface member implementation to include access modifiers, and it is a
compile-time error to include the modifiers abstract, virtual, override, or static.
然而在多态性中,俗话说 "the more derived type knows better",再次来自规范:
derived classes can extend and specialize base classes
因此,当您调用该接口成员时,将调用显式实现该接口的最派生类型。
当直接从实现者那里访问接口成员是不对的时候,我们通常会显式地实现接口class。天气它必须是内部的,或者它会导致与 API 设计的冲突,或者当它增加滥用方法的机会时。
在我看来绝对不鼓励为具有不同逻辑的多个接口单独实现成员,所以这里不是这种情况
编译器不允许虚拟这样的实现,因为它没有意义,我认为这是正确的。通常显式实现是非常敏感的,这就是你试图隐藏它的原因。
但是我发现了以下覆盖显式实现的方法(它不完全是覆盖,而是作弊的替代方法)
我发现这令人惊讶且非常失望。我的问题是为什么允许使用以下代码并且可以完美运行?我预计会收到接口已明确实现的错误。
这只是重现问题的基本示例
static void Main(string[] args)
{
var b = new Base();
((IInterface)b).Write();
var c = new Child();
((IInterface)c).Write();
}
public interface IInterface
{
void Write();
}
public class Base : IInterface
{
void IInterface.Write()
{
Console.WriteLine("Base");
}
}
public class Child : Base, IInterface // hack is here. Re Implemented :/
{
void IInterface.Write()
{
Console.WriteLine("Child");
}
}
Outputs
Base
Child
我建议您考虑从 C# 到本机代码的低级别转换:接口继承重新声明及其一个或多个方法覆盖,强制重写 VMT - 虚拟方法 Table (接口方法在设计上是虚拟的。
why following code is allowed and works perfectly?
因为规格是这样说的:
It is a compile-time error for an explicit interface member implementation to include access modifiers, and it is a compile-time error to include the modifiers abstract, virtual, override, or static.
然而在多态性中,俗话说 "the more derived type knows better",再次来自规范:
derived classes can extend and specialize base classes
因此,当您调用该接口成员时,将调用显式实现该接口的最派生类型。