我正在制作关于工厂的游戏。工厂里的箱子里装着东西。有时候会有仓库包含包含物品的箱子,而且工人需要在箱子里找到某些物品类型(例如,工人可以调用一个函数询问“任何仓库中是否有包含食物的箱子? “,如果是的话,他会去拿它并将它移动到某个地方。有时我需要任何“T”时,是否应该使用泛型?
用泛型定义”Crate“和”Furniture“类(从中继库)来指定哪些类型似乎非常有用。它们所包含的对象下面是我的木箱类和我的家具类的片段,然后我要和我挣扎得宝类:
public class Crate<I> : Item
where I : Item
{
}
public abstract class Furniture<I>
where I : Item
{
}
public class Depot : Furniture<Crate<???>>
{
//...
}
泛型是这里有用的,因为我就写下喜欢的搜索方法:
public I FindItem<I,F>
where I:Item
where F:Furniture<I>
{
//pseudocode
//foreach (furniture f in the factory);
//if (f is F) foreach (I i in f)
//if (i.IsAvailable) return i;
//return null;
}
现在,我的问题是,与大多数其他家具系列,仓库可以采取包装箱与他们任何东西(例如包装食品和包装箱的原材料)。但我不能只指定Crate(Item),因为它会弄乱我的搜索算法 - 寻找Crates of Food将返回null,因为它只包含Crates of Items。
我是否应该保留Crate的泛型,但将它们作为StorageFurniture进行废弃,并使我的搜索算法稍长一点(即搜索所有Furnitures而不是仅包含那些包含正确类型项目的Furnitures),还是有办法获得围绕这个问题?
考虑将问题重写得更加简洁。我觉得我必须理解整个系统来回答这个问题。 – 2013-02-11 19:05:01
我觉得如果我只是说“我应该什么时候使用泛型”,这个问题就太模糊了。实质上,我希望能够搜索包含包含特定项目的Crates的StorageFurniture。因此,如果StorageFurniture详细说明了需要的项目(有时候这将是'code'输入'代码'),那么这将使查找这些项目和箱子更容易。但是,当某些StorageFurniture可以包含任何类型的箱子时,我不知道如何声明它。 –
Haighstrom
2013-02-11 19:16:35
我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 – 2013-02-11 19:17:08