Nax*_*mus 9 c# inheritance explicit-interface
输出:
B->你好!来自明确.
不应该是:?
A->您好!来自明确.
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时才会发生是一个构造类型,其中泛型类型中声明的两个成员具有不同的签名,但类型参数使它们的签名相同.
| 归档时间: |
|
| 查看次数: |
2869 次 |
| 最近记录: |