【问题标题】:How do I inherit from Dictionary?我如何从字典继承?
【发布时间】:2010-12-08 09:01:33
【问题描述】:

我想要Dictionary<TKey,TValue> 的所有功能,但我想要Foo<TKey,TValue>
我应该怎么做?
目前我正在使用

class Foo<TKey,TValue> : Dictionary<TKey, TValue>
{   
    /*
     I'm getting all sorts of errors because I don't know how to 
     overload the constructors of the parent class.
    */
    // overloaded methods and constructors goes here.

    Foo<TKey,TValue>():base(){}
    Foo<TKey,TValue>(int capacity):base(capacity){}

}

重载父类的构造函数和方法的正确方法是什么?

注意:我认为我误用了“过载”这个词,请更正或建议更正。

【问题讨论】:

  • 您说(在对我的回答的评论中)它是装饰器模式的实现。无论它到底用于什么,我怀疑你应该从 Dictionary 继承,甚至不实现 IDictionary。我认为您应该只编写一个常规类,该类包含一个(私有)字典来管理其状态,并具有一些 Add、Remove 和 Get 类型的方法。

标签: c# inheritance collections


【解决方案1】:

你已经很接近了,你只需要从构造函数中删除类型参数。

class Foo<TKey,TValue> : Dictionary<TKey, TValue>
{   
    Foo():base(){}
    Foo(int capacity):base(capacity){}
}

要覆盖方法,您可以使用 override 关键字。

【讨论】:

  • 不在构造函数中,不...它们已经在类型中,因此它们已经“拥有”类型参数。
  • 不,TKey 和 TValue 现在被定义为类的一部分。您不需要在每个方法中重新定义它们。
  • public 必须在 C# 中明确定义,没有它一切都默认为 private。
  • 不引用一切默认为私有:类、结构和枚举默认为内部,而方法、属性和字段默认为私有。
  • 如果没有任何方法是虚拟的,那么从 Dictionary 继承有什么意义?
【解决方案2】:

不直接回答你的问题,只是一个建议。我不会继承字典,我会实现IDictionary&lt;T,K&gt; 并聚合一个字典。这很可能是一个更好的解决方案:

class Foo<TKey,TValue> : IDictionary<TKey, TValue>
{   

    private Dictionary<TKey, TValue> myDict;

    // ...
}

【讨论】:

  • (+1) 如果我只想使用 Dictionary 但名称为 Foo,您有什么建议?
  • 你为什么要这样做?一种 C 风格的 typedef?
  • 这是一个装饰器 (en.wikipedia.org/wiki/Decorator_pattern)。可能的缺点:您需要手动实现从类到成员字典的每个连接。
  • @Mao:是的,你需要实现每个方法,但你也可能会发现完全控制是可行的。
  • @TheChairman FWIW,如果您使用 ReSharper,有一个非常方便的上下文操作可以将所有 IDictionary 成员委托给 myDict 字段(修复“缺少成员”错误时)。您也可以按alt+ins 并选择“委派成员...”来插入它们。节省大量工作!
【解决方案3】:

如果您只想要相同的类型但名称不同,您可以使用using 别名来缩短它:

using Foo = System.Collections.Generic.Dictionary<string, string>;

然后

Foo f = new Foo();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 2013-09-17
    • 1970-01-01
    • 2018-02-09
    • 2011-02-05
    • 2017-09-26
    • 2013-08-02
    • 1970-01-01
    相关资源
    最近更新 更多