2011-08-29 70 views
2

ReadOnlyCollection怎麼可能實現IList?後者需要實現Add方法,並且ReadOnlyCollection不會實現這一點。然而,ReadOnlyCollection是具體的,可以被實例化...關於接口的問題

編輯

下面的代碼將不會在我的機器上編譯:

static void Main(string[] args) 
{ 
    List<string> people = new List<string>(){ 
     "Sidney", 
     "Jim", 
     "Bob"}; 

    ReadOnlyCollection<string> readOnlyPeople = new ReadOnlyCollection<string>(people); 
    readOnlyPeople.Add("Frank"); 
} 

在最後聲明中「添加」的號召現在在Visual Studio 2010中以藍色下劃線。

+1

該代碼不會編譯,因爲'Add'方法是_explicitly_實現的。你必須投入「IList」才能訪問它。 –

+0

我還是很困惑。它在哪裏「明確」實施?我以爲接口不支持實現方法... – Andrew

+1

你說得對,接口本身並不實現這個方法。顯式實現在C#中是一個特殊的東西 - [請參閱此答案的更多信息](http://stackoverflow.com/questions/143405/c-interfaces-implicit-and-explicit-implementation)。 –

回答

4

它實現了Add,實現只是拋出一個NotSupportedException

該實現使用「explicit interface implementation」,這是一種實現接口的方式,不需要將接口方法直接暴露爲實現類中的公共接口方法。當你有一個實現多個定義相同成員的接口的類時,這是非常有用的(參見鏈接示例)。基本上,它看起來是這樣的:

public interface IList<T> 
{ 
    int Add(object value); 
    // and a whole bunch of other stuff... 
} 

public class ReadOnlyCollection<T> : IList<T> 
{ 
    int IList<T>.Add(object value) 
    { 
     throw new NotSupportedException(); 
    } 
} 

通知add方法是多麼的不公開的,所以如果你有ReadOnlyCollection<T>一個實例,你不能直接調用就可以了Add。什麼但是你可以做,如果你想看到的例外,是投你的實例接口:

ReadOnlyCollection<string> readOnlyPeople = new ReadOnlyCollection<string>(people); 
((IList<string>)readonlyPeople).Add("Frank"); // <-- bang! 

,你可以實現它的另一種方法是聲明你的變量作爲IList<T>直接:

IList<string> readOnlyPeople = new ReadOnlyCollection<string>(people); 
readOnlyPeople.Add("Frank"); // <-- this should go 'bang!' too 
+0

感謝Jon的解釋。我以爲我瘋了,否則:) – Andrew