class Food {} class Apple : Food { } ...... // 我想达到这个目的: Dictionary<string, Food> dict = new Dictionary<string, Apple>();
Dictionary<string, Food> dict = new Dictionary<string, Food>(); // 为什么不写成这样?
你想实现什么效果,也许可以换一下思路
原本我的情况是类似
class Food {} class Apple : Food {} class Orange : Food {}
然后有几个类似于工厂的模块:
abstract class FoodFactory {
public abstract Dictionary<string, Food> CreateFood();
}
class AppleFactory : AppleFactory { public Dictionary<string, Food> CreateFood() { return new Dictionary<string, Apple>(); } } class OrangeFactory : AppleFactory{ public Dictionary<string, Food> CreateFood(){ return new Dictionary<string, Orange>(); } }
最后使用时
FoodFactory factory = ...... Dictionary<string, Food> dict = factory.CreateFood(); ......
不过后来想了一下,这样做肯定是不可以的
因为最后的 dict 声明时的类型是 Dictionary<string, Food>,对编译器来说,如果执行
dict["str1"] = new Apple();
它应该编译成功。
而实际运行时,dict 却可能是个 Dictionary<string, Orange>,这时执行上述语句就会出现类型错误。
@血狼一族: 我觉得你写的比较奇怪,为什么工厂里Create出来的要放了字典里,字典的key是怎么产生的?如果非要这样做,工厂里的字典也用food类型吧
@会长: 这个说来就话长了,里面涉及到的内容也太多,没个三五百字说不清,就算说清了估计也没人愿意看,所以不说了。上面只用个简单的模型讨论一下所需要解决的问题,纯讨论语言而已!
@血狼一族: 哈哈
Dictionary<string, Food> dict = new Dictionary<string, Apple>();
这么写是不行的, 这个应该涉及到协变和逆变的问题 可以参考 https://www.cnblogs.com/lovejenny/archive/2012/03/13/2392747.html
可以考虑像下面这么用
class Food {}
class Apple : Food { }
......
Dictionary<string, Food> dict = new Dictionary<string, Food>()
{
{"apple", new Apple();}
};
dict.Add("apple2", new Apple())
向下转型好像不能这么整……
字典存父类,用的时候转成子类