【问题标题】:What is the equivalent of Java's AbstractMap in C#?什么是 C# 中 Java 的 AbstractMap 的等价物?
【发布时间】:2008-12-04 06:21:23
【问题描述】:

我需要创建一个暴露IDictionary<K,V> 接口的对象,但我不想填写整个接口实现。

如果有相当于 Java 的 AbstractDictionary 就好了,这样您就几乎不需要执行一个完整的字典(HashMap,在 Java 中):

  • 如果您不需要迭代集合,您只需一个方法来实现 (TryGetValue)
  • 如果您希望它是可写的,您可以实现另一个条目(添加)。

【问题讨论】:

    标签: c# java collections dictionary


    【解决方案1】:

    Wintellect 的PowerCollections library 包含一个DictionaryBase 类(source code),它实现了大部分标准IDictionary 接口。来自类的文档 cmets:

    DictionaryBase 是一个基类 可以用来更容易地实现 通用 IDictionary 和 非泛型 IDictionary 接口。

    要将 DictionaryBase 用作基类, 派生类必须覆盖 Count, GetEnumerator、TryGetValue、清除、 删除,索引器设置访问器。

    【讨论】:

      【解决方案2】:

      System.Collections.Generic命名空间包含IDictionary<K,V>的三个实现:Dictionary<TKey, TValue>SortedDictionary<TKey, TValue>SortedList<TKey, TValue>

      【讨论】:

      • 我不认为这能回答这个问题 - AbstractDictionary 是您继承的抽象基础骨架实现。
      【解决方案3】:

      如果我要构建自己的字典类,我会从 System.Collections.ObjectModel.KeyedCollection 继承。

      为所有不了解 API 设计的人编辑。

      您永远不应该从公共属性或函数返回通用列表或字典。 Insead 你应该返回一个专门为此目的而构建的类。这样您就可以在以后为其添加其他功能。

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

      使用第二个版本,您可以执行诸如添加 Total 属性并让用户实际找到它的操作。

      理论上,您可以返回添加 Total 属性的 Dictionary 子类,但用户必须 A. 知道您正在执行此操作,并且 B. 包含强制转换才能访问该属性。

      【讨论】:

      • 为什么不使用提供的字典类?你是 NET 2 之前的吗?
      • ObjectModel.KeyedCollection 是一个 .NET 2 功能,专门为制作自己的字典类的人添加。
      • KeyedCollection 仅应在键从值派生时扩展。 IE:一个人类可能有一个社会安全号码,或者一个数据库记录有一个主键。因此,它并不总是适合用于字典的基类。
      猜你喜欢
      • 2010-12-07
      • 2010-11-22
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      相关资源
      最近更新 更多