调用 n.Add(1) 选择 IInteger.Add,方法是应用 错误!未找到引用源。 节的重载决策规则。类似的,调用 n.Add(1.0) 选择 IDouble.Add。插入显式强制转换后,就只有一个候选方法了,因此没有多义性。 在下面的示例中 interface IBase{void F(int i);} interface ILeft: IBase{new void F(int i);} interface IRight: IBase{void G();} interface IDerived: ILeft, IRight {} class A{void Test(IDerived d) { d.F(1); // Invokes ILeft.F ((IBase)d).F(1); // Invokes IBase.F ((ILeft)d).F(1); // Invokes ILeft.F ((IRight)d).F(1); // Invokes IBase.F}} IBase.F 成员被 ILeft.F 成员隐藏。因此,即使在通过 IRight 的访问路径中 IBase.F 似乎没有被隐藏,调用 d.F(1) 仍选择 ILeft.F。 多重继承接口中的直观隐藏规则简单地说就是:如果成员在任何一个访问路径中被隐藏,那么它在所有访问路径中都被隐藏。由于从 IDerived 经 ILeft 到 IBase 的访问路径隐藏了 IBase.F,因此该成员在从 IDerived 经 IRight 到 IBase 的访问路径中也被隐藏。 1.1 完全限定接口成员名 接口成员有时也用它的完全限定名 (fully qualified name) 来引用。接口成员的完全限定名是这样组成的:声明该成员的接口的名称,后跟一个点,再后跟该成员的名称。成员的完全限定名将引用声明该成员的接口。例如,给定下列声明 interface IControl{void Paint();} interface ITextBox: IControl{void SetText(string text);} Paint 的完全限定名是 IControl.Paint,SetText 的完全限定名是 ITextBox.SetText。 在上面的示例中,不能用 ITextBox.Paint 来引用 Paint。 当接口是命名空间的组成部分时,该接口的成员的完全限定名需包含命名空间名称。例如 namespace System{public interface ICloneable{ object Clone();}} 这里,Clone 方法的完全限定名是 System.ICloneable.Clone。

评论