假如在实现多个接口时,接口中包含有相同和函数,必须要显式地实现各个函数(有一个可以隐式实现),而且在以后调用的时候也必须通过接口调用。说不太清,还是看代码吧:
假如有两个接口IReadalbe和IStorable,都含有Read();
interface IStorable
{
void Read( );
}
interface IReadable
{
int Read();
}
然后,我们有个类使用这两个接口:
class Test : IStorable, IReadable
{
public int Read()
{
Console.WriteLine("Which one?");
return 1;
}
//void IStorable.Read()
//{
// Console.WriteLine("IStorable?");
//}
}
假如不取消注释,那么代码无法通过编译(没有实现全部接口)。取消注释后,int Read()表示为实现IReadable接口。写代码测试:
Test t = new Test();
t.Read(); //输出为 Which one?
IStorable a = t;
a.Read(); //输出为 IStorable
IReadable b = t;
b.Read(); //输出为 Which one?
看起来似乎没有什么问题,假如我们再显示地实现IReadable的Read(),即在Test类里面再添加如下代码:
int IReadable.Read()
{
Console.WriteLine("IReadable");
return 1;
}
再测试:
Test t = new Test();
t.Read(); //输出为 Which one?
IStorable a = t;
a.Read(); //输出为 IStorable
IReadable b = t;
b.Read(); //输出为 IReadable
这里看起来我们的确能够通过接口调用我们实现的函数,但是此时的t.Read()就不知道该算什么了。它似乎不是任何一个接口的实现,而且我们可以随意更改它的返回类型,看起来似乎它又成了一个独立函数?在第一次测试中,IReadable认为它是其实现并调用,可是在第二次测试中,IReadable发现了自己的专门实现后就不在调用它了。结果这个Read()就成了不是任何接口的实现,但它却和接口提供的函数同名! 或者说Test类的Read()实现了3个接口?
如果两个接口都是提供void Read(),那么我们只要实现在Test类里实现void Read()就可以算是同时实现了两个接口,不过我们仍然可以显式地为两个接口提供不同的实现函数,那样的话,我们仍然可以再存在一个与接口无关的同名函数。
此外,对于IReadable.Read()和IStorable.Read()都不能用pubic这类modifiers来修饰,否则报错。
虽然看起来是很奇怪的一种实现,而且也找不到什么实际的意义,不过既然发现了这个现象,先在此做个记录,说不定以后有新发现。
也希望有实际经验的人说说实际项目中会不会有这种情况。