【发布时间】:2019-11-28 16:16:29
【问题描述】:
为什么这个程序打印“子名”而不是“基本名”?
using System;
class Program
{
static void Main(string[] args)
{
var child = new Child();
Console.WriteLine(((INamedObject)child).Name);
Console.ReadLine();
}
}
interface INamedObject
{
string Name { get; }
}
class Base : INamedObject
{
string INamedObject.Name
{
get
{
return "Base Name";
}
}
}
class Child : Base, INamedObject
{
public string Name
{
get
{
return "Child Name";
}
}
}
我希望当我将 child 转换为 INamedObject 时,将调用 INamedObject 显式实现的 Name 属性。但是发生的情况是调用了 Child.Name 属性。
为什么当我这样声明 Child 类时(从 Child 中删除 INamedObject):
class Child : Base
{
public string Name
{
get
{
return "Child Name";
}
}
}
它开始打印“基本名称”?
【问题讨论】:
-
您有两个 INamedObject 实现。当您将对象转换为接口时,您将获得最派生的实现。
-
子类有 两个 的 INamedObject.Name 实现,您总是希望避免这种情况。但它不会混淆 CLR,它会在运行时知道当它绑定接口时 Child 具有更直接的匹配而不是继承。有时您必须使用显式接口实现,当一个类实现碰巧具有相同成员名称的多个接口时,它是为了解决歧义,这不是一个例子。