2011-08-29 6 views
2

ReadOnlyCollectionIList을 어떻게 구현할 수 있습니까? 후자는 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

추가 기능을 구현하면 구현시 간단하게 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(); 
    } 
} 

공지 사항, 그래서 당신은 ReadOnlyCollection<T>의 인스턴스가있는 경우, 당신은 직접에 Add를 호출 할 수 없습니다.

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

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

당신이 그것을 얻을 수있는 다른 방법은 직접 IList<T>로 변수를 선언하는 것입니다 : 당신이 예외를보고 싶은 경우, 그러나 할 수있는 것은, 인터페이스에 인스턴스를 캐스팅

+0

Jon의 설명에 감사드립니다. 나는 미쳤다고 생각했다. 그렇지 않으면 :) – Andrew