假如在實現(xiàn)多個接口時,接口中包含有相同和函數(shù),必須要顯式地實現(xiàn)各個函數(shù)(有一個可以隱式實現(xiàn)),而且在以后調(diào)用的時候也必須通過接口調(diào)用。說不太清,還是看代碼吧:
假如有兩個接口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?");
//}
}
假如不取消注釋,那么代碼無法通過編譯(沒有實現(xiàn)全部接口)。取消注釋后,int Read()表示為實現(xiàn)IReadable接口。寫代碼測試:
Test t = new Test();
t.Read(); //輸出為 Which one?
IStorable a = t;
a.Read(); //輸出為 IStorable
IReadable b = t;
b.Read(); //輸出為 Which one?
看起來似乎沒有什么問題,假如我們再顯示地實現(xiàn)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
這里看起來我們的確能夠通過接口調(diào)用我們實現(xiàn)的函數(shù),但是此時的t.Read()就不知道該算什么了。它似乎不是任何一個接口的實現(xiàn),而且我們可以隨意更改它的返回類型,看起來似乎它又成了一個獨立函數(shù)?在第一次測試中,IReadable認為它是其實現(xiàn)并調(diào)用,可是在第二次測試中,IReadable發(fā)現(xiàn)了自己的專門實現(xiàn)后就不在調(diào)用它了。結(jié)果這個Read()就成了不是任何接口的實現(xiàn),但它卻和接口提供的函數(shù)同名! 或者說Test類的Read()實現(xiàn)了3個接口?
如果兩個接口都是提供void Read(),那么我們只要實現(xiàn)在Test類里實現(xiàn)void Read()就可以算是同時實現(xiàn)了兩個接口,不過我們?nèi)匀豢梢燥@式地為兩個接口提供不同的實現(xiàn)函數(shù),那樣的話,我們?nèi)匀豢梢栽俅嬖谝粋€與接口無關(guān)的同名函數(shù)。
此外,對于IReadable.Read()和IStorable.Read()都不能用pubic這類modifiers來修飾,否則報錯。
雖然看起來是很奇怪的一種實現(xiàn),而且也找不到什么實際的意義,不過既然發(fā)現(xiàn)了這個現(xiàn)象,先在此做個記錄,說不定以后有新發(fā)現(xiàn)。
也希望有實際經(jīng)驗的人說說實際項目中會不會有這種情況。