我是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();
}
}
}
}
有没有办法或解决方案满足我的需求?
谢谢! 安娜
答案 0 :(得分:3)
您可以在基本类型(Clone
)上abstract
virtual
或Element
,在派生类型中override
,但是在覆盖时不能更改返回类型,因此它必须是Element
(没有更具体的)。你可以重新声明方法(new
...),但这会变得混乱,你不能override
和new
一个同名的方法/签名属于同一类型。
但是,如果您对返回类型为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方法。
我会:
这样,代码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”