我正在制作一个关于工厂的游戏。工厂里装满了东西的板条箱被搬来搬去。有时会有包含装有物品的板条箱的仓库,并且工作人员需要在可用的板条箱中查找某些类型的物品(例如,工作人员可能会调用一个函数,询问“任何仓库中是否有任何装有食物的板条箱? ”,如果是这样,他会去捡起它并把它移到某个地方。
用泛型定义“Crate”和“Furniture”类(从 Depot 继承)来指定它们包含的对象类型似乎非常有用。下面是我的 Crate 类和 Furniture 类的片段,然后是我正在努力解决的 Depot 类:
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 废弃它们,并使我的搜索算法稍长一些(即搜索所有家具,而不仅仅是那些包含正确类型项目的家具),还是有办法解决这个问题?