2008-12-04 43 views
3

我需要創建一個暴露IDictionary<K,V>接口的對象,但我不想填寫整個接口實現。在C#中Java的AbstractMap等價於什麼?

這將是不錯的Java的AbstractDictionary,這讓你很少impelment一個完整的字典相當於(HashMap的,在Java):

  • 如果您不需要重複收集,你有一個方法來實現(TryGetValue)
  • 如果你希望它是可寫的,你可以實現另一個條目(Add)。

回答

3

System.Collections.Generic命名空間包含的IDictionary<K,V>三種實現:Dictionary<TKey, TValue>SortedDictionary<TKey, TValue>SortedList<TKey, TValue>

+2

我不認爲這回答了這個問題 - AbstractDictionary是一個抽象的基本框架實現,你繼承自。 – serg10 2008-12-05 15:55:58

0

如果我構建自己的字典類,我從System.Collections.ObjectModel.KeyedCollection繼承。

編輯爲所有那些誰不懂API設計。

你永遠不應該從公共屬性或函數返回一個通用的List或Dictionary。除此之外,你應該返回專門爲此目的建造的課程。通過這種方式,您可以在稍後添加其他功能。

Dictionay<integer, Order> Orders() {get;} 
CustomerOrders Orders() {get;} 

隨着第二個版本,你可以做一些事情,如添加一個Total屬性,並讓用戶真正找到它。

從理論上講,您可以返回添加Total屬性的Dictionary的子類,但用戶將不得不知道您正在做它,並且包含一個要轉到屬性的轉換。

+0

爲什麼不使用提供的字典類? NET 2是你的嗎? – johnc 2008-12-04 07:56:11

4

Wintellect的PowerCollections library包括一個DictionaryBase類(source code),它實現了大部分標準IDictionary < K,V>接口。從類文檔註釋:

DictionaryBase是一個基類, 可以用來更容易地實現 通用的IDictionary < T>和 非通用的IDictionary接口。

要使用DictionaryBase作爲基類, 派生類必須重寫計數, 的GetEnumerator,TryGetValue,清除, 刪除和索引set訪問。

相關問題