调用 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。
评论