假如在實現多個接口時,接口中包含有相同和函數,必須要顯式地實現各個函數(有一個可以隱式實現),而且在以后調用的時候也必須通過接口調用。說不太清,還是看代碼吧:
假如有兩個接口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來修飾,否則報錯。
雖然看起來是很奇怪的一種實現,而且也找不到什么實際的意義,不過既然發現了這個現象,先在此做個記錄,說不定以后有新發現。
也希望有實際經驗的人說說實際項目中會不會有這種情況。