接口成员访问
接口成员时通过LM形式的成员访问表达式和I[A]形式的索引器访问表达式来访问的,其中I是接口类型,M是该接口类型的方法、属性或事件,A是对应的索引器参数列表。
对于严格单一继承(继承链中的每个接口均恰好有零个或一个直接基接口)的接口,成员查找、方法调用和索引器访问规则的效果与类和结构的完全相同:派生程度较大的成员隐藏具有相同名称或签名的派生程度较小的成员。然而,对于多重继承接口,当两个或更多个不相关(互不继承)的基接口中声明了具有相同名称或签名的成员时,就会发生多义性。
interface IList
{
int Count { get; set; }
}
interface ICounter
{
void Count(int i);
}
interface IListCounter : IList, ICounter { }
class C
{
void Test(IListCounter x)
{
x.Count(1); //Error
x.Count = 1; //Error
((IList)x).Count = 1;
((ICounter)x).Count(1);
}
interface IInteger
{
void Add(int i);
}
interface IDouble
{
void Add(double i);
}
interface INumber : IInteger, IDouble { }
class C
{
void Test(INumber n)
{
n.Add(1); //Error
n.Add(1.0);
((IInteger)n).Add(1);
((IDouble)n).Add(1);
}
}
由于方法调用要求以相同类型声明所有的重载候选方法,因此调用n.Add(1)是不明确的。然而,调用n.Add(1.0)是允许的,这是因为只有IDouble.Add使用。插入显式强制转换后,就只有一个候选方法了,因此没有多义性。
c#接口继承和类继承
c#接口继承和类继承不同,首先,类继承不仅是说明继承,而且也是实现继承;而接口继承只是说明继承。也就是说,派生类可以继承基类的方法实现,而派生的接口只继承了父接口的成员方法说明,而没有继承父接口的实现;其次,c#中类继承只允许单继承,但是接口继承允许多继承,一个子接口可以有多个父接口。