2009-05-22 5 views
3

IDictionary 인터페이스의 필요성. 어떻게 IDictionary 인터페이스를 초기화 할 수 있습니다. 결국 그것은 단지 인터페이스 일뿐입니다. 다음 코드 스 니펫은 msdn에서 제공됩니다. 나는 그것을 이해할 수 없었다.IDictionary 인터페이스의 용도

IDictionary<string, string> openWith = new Dictionary<string, string>(); 

답변

11

사전에 구현해야하는 중요 functions을 정의합니다.

MSDN에서

라인은 개체 IDictionary 인터페이스에 정의 된 함수 (방식)를 구현 openWith을 만드는 것을 의미한다.

Dictionary<string,string> openWith=.....; 

당신이 객체의 구체적인 유형 바인드 있습니다

당신이 좋아하는 변수를 선언하기 위해 사전을 사용

. 하지만

IDictionary<string,string> openWith=....; 

를 사용할 때 IDictionary인터페이스를 구현하는 객체로 사용할 수 있습니다, 인터페이스의

9

요점이 제공하는 것입니다 :) 아마 사용자 정의 클래스 ... 음 , 어떤 모듈 (여기서는 넓은 의미에서 "모듈"을 사용합니다)에 대한 인터페이스를 제공하므로 호출 코드는이 특정 인터페이스가 어떻게 구현되는지에 대해 걱정할 필요가 없습니다.

"어떻게 IDictionary 인터페이스를 초기화 할 수 있습니까?"라는 말은 기술적으로 올바르지 않습니다. 초기화 할 수있는 변수는 유형이 IDictionary<T, V>입니다. 물론 충분한 변수를 초기화해야하지만 대개 "클라이언트 코드"에서 숨겨집니다.

IDictionary은 그다지 대표적인 것은 아닙니다. 오히려 IDataReader 인터페이스를 고려하십시오. 당신은 확실히 ADO.NET 처리, 그래서이 익숙 할 것이다 :

public Foo PopulateFromDataReader(SqlDataReader dataReader) 

이 특별한 방법은 단단히 SqlDataReader에 연결되어, 당신이 그것을 지원하는, 말, 액세스하거나 그것을 다시 작성해야 할 것이다 그래서 오라클 또는 MySQL 또는 파이어 버드 또는 기타. 즉, 구현에 의존합니다.

지금 생각해

public Foo PopulateFromDataReader(IDataReader dataReader) 

이 방법은 기본적으로 어떤 ADO.NET 호환 데이터 공급자와 의미 IDataReader를 구현하는 어떤 클래스와 함께 사용할 수 있습니다.

+0

+1 아주 좋은 예입니다. :) 당신이 나를 혼란스럽게 만드는 diff를 제거했습니다. 훌륭한 예입니다. 이 예에서는 –

5

다른 인터페이스와 다를 바 없습니다. 보다 간단한 예제를 생각해보십시오.

interface IThermometer 
{ 
    double CurrentTemperature { get; } 
} 

온도를 측정하는 방법은 있지만 정확한 측정 방법은 없습니다.

class MercuryThermometer : IThermometer 
{ 
    public double CurrentTemperature 
    { 
     get { return ... /* gets the temperature somehow */ } 
    } 
} 

나머지 프로그램은 어떤 온도계를 사용하는지 알 필요가 없습니다.

+0

+1 ... –

1

난 당신이 단순히 IDictionary<,> (인터페이스)로 입력 변수의 차이를 간과 한 의심하고 Dictionary<,>로 초기화 값 (참조) (더 I주의 없으며 구체적인 유형).

1

단위 테스트에도 유용합니다. 사전 대신 IDictionary를 허용하고 모의를 전달하는 메서드에 대한 단위 테스트를 작성할 수 있습니다. 클래스 인스턴스 (봉인 될 수도 있음)를 수락한다면 약간 조이가 듭니다 (어댑터 패턴 등을 사용해야 할 것입니다).