如何将所有词典放入从词典派生类型的对象中?

问题描述

class XDictionary<TKey,TValue> : Dictionary<string,string>
{
}

        Dictionary<string,string> d = new Dictionary<string,string>
        {
            { "x","xx" },{ "y","yy" },{ "z","zz" }
        };

        XDictionary<string,string> x;

有没有一种方法可以仅使用上投/下播就将x放到x中而无需foreach?

解决方法

首先,您必须遍历各个项目(这不是问题)的原因是因为您要复制它们。

如果仅将字典作为新的内部表示形式引用,则将有多个对象处理同一数据。

尽管这与您继承它无关-当您从另一个Dictionary(而不是xDictionary)创建一个新Dictionary时,您会想要相同的东西。

对于向下转换-通常是不可能的,除非要转换的类型与运行时类型本身或它们之间的层次结构中的任何内容匹配。

因此,您不会以某种方式对其进行迭代,但是可以将其传递给已经实现此功能的base-copy-constructor:

class XDictionary<TKey,TValue> : Dictionary<TKey,TValue>
{
    public XDictionary() { }
    public XDictionary(IDictionary<TKey,TValue> dict) : base(dict) { }
}

Dictionary<string,string> d = new Dictionary<string,string>
{
    { "x","xx" },{ "y","yy" },{ "z","zz" }
};

XDictionary<string,string> xDict = new XDictionary<string,string>(d);

还请注意,在为类声明通用类型参数时,必须将它们转发给基类,以使其有意义。


我不同意您问题下方的一些评论。

有一个准则prefer composition over inheritance,这确实是有原因的。 但是,教条主义并没有帮助,因为有了构图:

  • 您必须编写更多代码才能真正实现相同的基本功能。
  • 您还有一个分散在堆上的对象。

因此,如果您不打算将Dictionary更改为其他内容-而是扩展它的功能-继承它就很好了。

为清楚起见,您可以问自己这个问题:

我的实现应该是 某种字典(继承性)还是使用字典(组成)。

使用继承时需要注意一些事情,但是当您不以任何方式更改内部表示形式和相等/比较机制时,您现在就很好了。


如果您想对字典进行更多修改而不只是扩展字典,请考虑使用System.Collections.DictionaryBase作为基类。

此抽象类仍将为您完成大部分繁重的工作,但通过抽象为您的实现提供更多的自由。