Мне нужно создать объект, который предоставляет интерфейс IDictionary<K,V>, но я не хочу заполнять всю реализацию интерфейса.
Было бы неплохо иметь эквивалент AbstractDictionary в Java, который оставляет очень мало возможностей для создания полного словаря (HashMap, в Java):





Пространство имен System.Collections.Generic содержит три реализации IDictionary<K,V>: Dictionary<TKey, TValue>, SortedDictionary<TKey, TValue> и SortedList<TKey, TValue>.
Если я создаю свой собственный класс словаря, я наследую от System.Collections.ObjectModel.KeyedCollection.
РЕДАКТИРОВАТЬ для всех, кто не разбирается в дизайне API.
Вы никогда не должны возвращать общий список или словарь из общедоступного свойства или функции. Insead вы должны вернуть класс, специально созданный для этой цели. Таким образом, вы можете добавить к нему дополнительные функции позже.
Dictionay<integer, Order> Orders() {get;}
CustomerOrders Orders() {get;}
Во второй версии вы можете делать такие вещи, как добавление свойства Total, и пользователь действительно его находит.
Теоретически вы можете вернуть подкласс Dictionary, который добавляет свойство Total, но тогда пользователь должен будет A. знать, что вы это делаете, и B. включить приведение, чтобы добраться до свойства.
Почему бы не использовать прилагаемый класс словаря? ты pre, NET 2?
ObjectModel.KeyedCollection - это функция .NET 2, специально добавленная для людей, создающих собственные классы словарей.
KeyedCollection следует расширять только тогда, когда ключи являются производными от значений. IE: Класс человека может иметь номер социального страхования или запись в базе данных может иметь первичный ключ. По сути, это не всегда подходящий базовый класс для словарей.
Библиотека PowerCollections Wintellect включает класс DictionaryBase (исходный код), который реализует большую часть стандартного интерфейса IDictionary <K, V>. Из комментариев к документации класса:
DictionaryBase is a base class that can be used to more easily implement the generic IDictionary<T> and non-generic IDictionary interfaces.
To use DictionaryBase as a base class, the derived class must override Count, GetEnumerator, TryGetValue, Clear, Remove, and the indexer set accessor.
Я не думаю, что это ответ на вопрос: AbstractDictionary - это реализация абстрактного базового скелета, от которой вы наследуете.