C# - 具有继承的显式接口?

Nax*_*mus 9 c# inheritance explicit-interface

输出:
B->你好!来自明确.

不应该是:?
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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 20

不,它不应该.

调用Hello等同于注释掉的 - 获取IHello无关紧要的路径(除非它需要执行时间检查或转换); 编译时类型只是IHello两种方式,接口映射是相同的,但是你到达那里.

当在类型层次结构中多次显式实现接口时,将使用最派生类型的实现.(通过界面调用时.)

从C#3.0规范的第13.4.4节:

类或结构C的接口映射为C的基类列表中指定的每个接口的每个成员定位实现.确定特定接口成员IM的实现,其中I是声明成员M的接口,通过检查每个类或结构S,从C开始并重复每个连续的C类基类,直到找到匹配:

  • 如果S包含与I和M匹配的显式接口成员实现的声明,则此成员是IM的实现
  • 否则,如果S包含与M匹配的非静态公共成员的声明,则此成员是IM的实现如果多个成员匹配,则未指定哪个成员是IM的实现这种情况只有在S时才会发生是一个构造类型,其中泛型类型中声明的两个成员具有不同的签名,但类型参数使它们的签名相同.

  • +1.从较低级别的角度来看,在B类的vtable中有一个单独的方法槽用于`IHello.Hello`,其中将查找实现. (3认同)