2009-05-22 2 views
3

В чем нуждается интерфейс IDictionary. Как можно инициализировать интерфейс IDictionary. Ведь это всего лишь интерфейс. Следующий фрагмент кода из msdn. Я не мог этого понять.Назначение интерфейса IDictionary

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

ответ

11

Он определяет важную functions, что словарь должен реализовать.

Линия от MSDN означает, что вы создаете объект OpenWith, который реализует функции (методы), определенные в интерфейсе IDictionary.

При использовании словаря, чтобы объявить переменную как:

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

вы связываетесь с конкретным типом объекта. Но когда вы используете

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

вы можете использовать его с любым объектом, который реализует IDictionaryинтерфейс, может быть, свой собственный пользовательский класс :)

9

Весь смысл интерфейсов заключается в обеспечении ... хорошо , интерфейс к любому модулю (я использую «модуль» в широком смысле здесь), так что вызывающему коду не придется беспокоиться о том, как реализован этот конкретный интерфейс.

Что касается «Как можно инициализировать интерфейс IDictionary», это технически неверно. То, что может быть инициализировано, является переменной, тип которой равен IDictionary<T, V>. Разумеется, переменные должны быть инициализированы, но это обычно скрыто от «кода клиента».

IDictionary не очень репрезентативный, однако. Скорее, рассмотрим интерфейс IDataReader. Вы, конечно, дело с ADO.NET, так что это должно выглядеть знакомым:

public Foo PopulateFromDataReader(SqlDataReader dataReader) 

Данный метод тесно связан с SqlDataReader, так что вам придется переписать его для того, чтобы поддержать, скажем, Access или Oracle или MySQL или Firebird или что-то еще. Другими словами, вы зависите от реализации.

Теперь рассмотрит:

public Foo PopulateFromDataReader(IDataReader dataReader) 

Этого метод может быть использован с любым классом, который реализует IDataReader, что означает, с практически любым ADO.NET-совместимый поставщиком данных.

+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 вместо словаря и передает макет. Если бы он принимал экземпляр класса (который также мог быть запечатан), вы были бы немного ввернуты (вам придется использовать шаблон адаптера и т. Д.).

 Смежные вопросы

  • Нет связанных вопросов^_^