首页 新闻 搜索 专区 学院

Dictionary 的值如何使用泛型?

0
悬赏园豆:10 [已解决问题] 解决于 2022-03-17 09:09
class Food {}
class Apple : Food { }
......
// 我想达到这个目的:
Dictionary<string, Food> dict = new Dictionary<string, Apple>();
血狼一族的主页 血狼一族 | 初学一级 | 园豆:73
提问于:2022-03-09 09:41
< >
分享
最佳答案
0
Dictionary<string, Food> dict = new Dictionary<string, Food>(); // 为什么不写成这样?

你想实现什么效果,也许可以换一下思路

收获园豆:3
会长 | 专家六级 |园豆:11046 | 2022-03-09 10:01

 原本我的情况是类似

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>,这时执行上述语句就会出现类型错误。

 

血狼一族 | 园豆:73 (初学一级) | 2022-03-09 20:40

@血狼一族: 我觉得你写的比较奇怪,为什么工厂里Create出来的要放了字典里,字典的key是怎么产生的?如果非要这样做,工厂里的字典也用food类型吧

会长 | 园豆:11046 (专家六级) | 2022-03-10 10:19

@会长: 这个说来就话长了,里面涉及到的内容也太多,没个三五百字说不清,就算说清了估计也没人愿意看,所以不说了。上面只用个简单的模型讨论一下所需要解决的问题,纯讨论语言而已!

血狼一族 | 园豆:73 (初学一级) | 2022-03-10 12:00

@血狼一族: 哈哈

会长 | 园豆:11046 (专家六级) | 2022-03-10 12:06
其他回答(3)
0
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())
收获园豆:3
Laggage | 园豆:823 (小虾三级) | 2022-03-09 13:01
0

向下转型好像不能这么整……

收获园豆:2
echo_lovely | 园豆:662 (小虾三级) | 2022-03-10 15:49
0

字典存父类,用的时候转成子类

收获园豆:2
WmW | 园豆:255 (菜鸟二级) | 2022-03-11 16:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册