· 如果 S 包含一个与 I 和 M 匹配的显式接口成员实现的声明,那么此成员就是 I.M 的实现。
· 否则,如果 S 包含与 M 匹配的非静态的 public 成员声明,则此成员就是 I.M 的实现。
如果不能为在 C 的基类列表中指定的所有接口的所有成员找到实现,则将发生编译时错误。请注意,接口的成员包括那些从基接口继承的成员。
根据接口映射的含义,类成员 A 在下列情况下与接口成员 B 匹配:
· A 和 B 都是方法,并且 A 和 B 的名称、类型和形参表都相同。
· A 和 B 都是属性,A 和 B 的名称和类型相同,并且 A 与 B 具有相同的访问器(如果 A 不是显式接口成员实现,则它可以具有其他访问器)。
· A 和 B 都是事件,并且 A 和 B 的名称和类型相同。
· A 和 B 都是索引器,A 和 B 的类型和形参表相同,并且 A 与 B 具有相同的访问器(如果 A 不是显式接口成员实现,则它可以具有其他访问器)。
接口映射算法中隐含着下列值得注意的特征:
· 在类或结构成员中确定哪个实现了接口成员时,显式接口成员实现比同一个类或结构中的其他成员具有更高的优先级。
· 接口映射不涉及非公共成员和静态成员。
在下面的示例中
interface ICloneable
{
object Clone();
}
class C: ICloneable
{
object ICloneable.Clone() {...}
public object Clone() {...}
}
C 的 ICloneable.Clone 成员成为 ICloneable 中 Clone 的实现,这是因为显式接口成员实现优先于其他成员。
如果类或结构实现两个或更多个接口,而这些接口包含具有相同名称、类型和参数类型的成员,则这些接口成员可以全部映射到单个类或结构成员上。例如
interface IControl
{
void Paint();
}
interface IForm
{
void Paint();
}
class Page: IControl, IForm
{
public void Paint() {...}
}
在此,IControl 和 IForm 的 Paint 方法都映射到 Page 中的 Paint 方法。当然也可以为这两个方法提供单独的显式接口成员实现。
如果类或结构实现一个包含被隐藏成员的接口,那么一些成员必须通过显式接口成员实现来实现。例如
interface IBase
{
int P { get; }
}
interface IDerived: IBase
{
new int P();
}
此接口的实现将至少需要一个显式接口成员实现,可采取下列形式之一
class C: IDerived
{
int IBase.P { get {...} }
int IDerived.P() {...}
}
class C: IDerived
{
public int P { get {...} }
int IDerived.P() {...}
}
class C: IDerived
{
int IBase.P { get {...} }
public int P() {...}
}
当一个类实现多个具有相同基接口的接口时,为该基接口提供的实现只能有一个。在下面的示例中
interface IControl
{
void Paint();
}
interface ITextBox: IControl
{
void SetText(string text);
}
评论