工場のゲームを作っています。工場には、物が入った箱が移動しています。時々、アイテムを含むクレートを含むデポがあり、ワーカーは利用可能なクレートで特定のタイプのアイテムを探す必要があります (たとえば、ワーカーは、「食品を含むデポにクレートはありますか? 」 もしそうなら、彼はそれを拾いに行き、どこかに移動します.
"Crate" クラスと "Furniture" クラス (Depot が継承する) の両方を Generics で定義して、それらに含まれるオブジェクトのタイプを指定することは非常に便利に思えました。以下は、私のクレート クラスと家具クラス、そして私が苦労しているデポ クラスのスニペットです。
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 を検索すると、Crates of Items しか含まれていないため、null が返されます。
Crate 用のジェネリックを保持し、StorageFurniture 用に破棄し、検索アルゴリズムを少し長くする必要があります (つまり、正しいタイプのアイテムを含む家具だけでなく、すべての家具を検索します)、またはこの問題を回避する方法はありますか?