列出不同类型

时间:2010-02-20 10:11:19

标签: c# generics derived

我是C#的新手......(.net 3.5)

我希望Dictionary包含两种不同类型的对象,其中一种类型是通用的。在遍历列表时,我将调用add和clone之类的方法。  我已经尝试过基类和子类....

namespace ConsoleApplication1 {
    class Element{
    }
    class Child1 : Element {
        public Child1 Clone() { return clone; }
    }
    class Child2<T> : Element {
        public Child2<T> Clone() { return clone; }
    }
    class Program {
        static void Main(string[] args) {
            Dictionary<string, Element> d = new Dictionary<string, Element>();
            d.Add("c1",  new Child1());
            d.Add("c2s", new Child2<string>());
            d.Add("c2i", new Child2<int>());
            foreach (KeyValuePair<string, Element> kvp in d) {
                Element e = kvp.Value.Clone();
            }
        }
    }
}

有没有办法或解决方案满足我的需求?

谢谢! 安娜

4 个答案:

答案 0 :(得分:3)

您可以在基本类型(Clone)上abstract virtualElement,在派生类型中override,但是在覆盖时不能更改返回类型,因此它必须是Element(没有更具体的)。你可以重新声明方法(new ...),但这会变得混乱,你不能overridenew一个同名的方法/签名属于同一类型。

但是,如果您对返回类型为Element ...

感到高兴
abstract class Element{
    public abstract Element Clone();
}
class Child1 : Element {
    public override Element Clone() { return /* your code */; }
}
class Child2<T> : Element {
    public override Element Clone() { return /* your code */; }
}

答案 1 :(得分:2)

由于您从字典中获取的.Value类型是Element,因此您需要确保Element定义它应具有的所有操作,例如Clone方法。

我会:

  1. 使克隆虚拟,并将其添加到元素(或使元素抽象,克隆抽象而不是虚拟)
  2. 覆盖Child1和Child2中的克隆
  3. 这样,代码kvp.Value.Clone()将根据字典返回的对象调用正确的Clone方法。

答案 2 :(得分:0)

不要创建类层次结构只是,以便能够将不同的对象添加到一个字典中。

如果类没有足够的层次关系,那么最好使用像ICloneable这样的接口,它已经在.NET框架中可用了。

然后,只需将您的词典实例化为:

Dictionary<string, ICloneable> d = new Dictionary<string, ICloneable>();

它更灵活。为了能够执行Clone()的共性而创建层次结构,不是正确的解决方案IMO。

答案 3 :(得分:0)

虽然我同意Wim,但实现ICloneable可能是更好的解决方案,而不是试图强制执行不存在的类层次结构,请注意ICloneable被视为“错误的API”因为它没有指定它是使用浅层还是深层复制语义(例如参见http://pro-thoughts.blogspot.com/2009/02/write-deep-clone-forget-about.html或者谷歌搜索“ICloneable C#bad API”