输出:
B->你好!来自Explicit。
不应该是吗?
A->你好!来自Explicit。
为什么不从类A显式转换(IHello)a调用IHello.Hello()?
interface IHello
{
void Hello();
}
class A : IHello
{
public virtual void Hello()
{
Console.WriteLine("A->Hello!");
}
void IHello.Hello()
{
Console.WriteLine("A->Hello! from Explicit.");
}
}
class B : A, IHello
{
public override void Hello()
{
Console.WriteLine("B->Hello!");
}
void IHello.Hello()
{
Console.WriteLine("B->Hello! from Explicit.");
}
}
class Program
{
static void Main(string[] args)
{
A a = new B();
((IHello)a).Hello();
}
}
最佳答案
不,不应该。
对Hello
的调用等效于已注释掉的调用-获取IHello
的途径无关紧要(除非需要执行时间检查或转换);无论哪种方式,编译时类型都是IHello
,并且接口(interface)映射是相同的,但是您到达那里。
当在类型层次结构中多次明确地实现一个接口(interface)时,将使用最派生类型的实现。 (通过接口(interface)调用时。)
根据C#3.0规范的第13.4.4节:
关于C#-具有继承的显式接口(interface)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1856516/