Весь смысл интерфейсов заключается в обеспечении ... хорошо , интерфейс к любому модулю (я использую «модуль» в широком смысле здесь), так что вызывающему коду не придется беспокоиться о том, как реализован этот конкретный интерфейс.
Что касается «Как можно инициализировать интерфейс 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-совместимый поставщиком данных.
+1 Очень хороший пример .. :) вы очистили diff, который заставлял меня смущать ... отличный пример. –