2008-12-04 7 views
3

J'ai besoin de créer un objet qui expose une interface IDictionary<K,V>, mais je ne veux pas remplir l'implemntation de l'interface entière.Quel est l'équivalent de AbstractMap de Java en C#?

Il serait agréable d'avoir l'équivalent de AbstractDictionary de Java, ce qui vous laisse très peu à impelment un dictionnaire complet (HashMap, en Java):

  • Si vous n'avez pas besoin d'itérer la collection, vous avez une seule méthode à implémenter (TryGetValue)
  • Si vous voulez qu'il soit inscriptible, vous implémentez une autre entrée (Ajouter).

Répondre

3

espace de noms System.Collections.Generic contient trois implémentations de IDictionary<K,V>: Dictionary<TKey, TValue>, SortedDictionary<TKey, TValue> et SortedList<TKey, TValue>.

+2

Je ne pense pas que cela réponde à la question - AbstractDictionary est une implémentation de base de squelette abstraite dont vous héritez. – serg10

0

Si je construis ma propre classe de dictionnaire, j'hérite de System.Collections.ObjectModel.KeyedCollection.

EDIT pour tous ceux qui ne comprennent pas la conception API.

Vous ne devez jamais renvoyer une liste ou un dictionnaire générique à partir d'une propriété ou d'une fonction publique. Insead vous devriez retourner une classe spécialement construite à cet effet. De cette façon, vous pouvez ajouter des fonctionnalités supplémentaires plus tard. Avec la deuxième version, vous pouvez faire des choses comme ajouter une propriété Total et demander à l'utilisateur de la trouver.

En théorie, vous pouvez renvoyer une sous-classe de Dictionary qui ajoute la propriété Total, mais l'utilisateur doit alors savoir que vous le faites et B. inclure un cast pour accéder à la propriété.

+0

Pourquoi ne pas utiliser la classe de dictionnaire fournie? êtes-vous pré, NET 2? – johnc

+0

ObjectModel.KeyedCollection est une fonctionnalité .NET 2 spécialement ajoutée pour les personnes créant leurs propres classes de dictionnaire. –

+0

'KeyedCollection' ne devrait être étendu que lorsque les clés sont dérivées des valeurs. IE: Une classe de personne peut avoir un numéro de sécurité sociale, ou un enregistrement de base de données aurait une clé primaire. En tant que tel, ce n'est pas toujours une classe de base appropriée à utiliser pour les dictionnaires. –

4

Wintellect de PowerCollections library comprend une classe DictionaryBase (source code) qui implémente la plupart des standards IDictionary < K, V> Interface. D'après les commentaires de documentation de la classe:

DictionaryBase est une classe de base qui peut être utilisé pour mettre en œuvre plus facilement IDictionary générique < T> et interfaces IDictionary non génériques.

Pour utiliser DictionaryBase comme une classe de base, la classe dérivée doit passer outre le comte, GetEnumerator, TryGetValue, Effacer, Supprimer, et l'accesseur set indexeur.

Questions connexes