私は3つの異なるリンクリストのクラスを持っています(私が取り組んでいるゲームでエンティティを保存するため)。リストはすべて同じ基本タイプのオブジェクトですが、処理上の理由から別々にしています。IEntity、IObject、および IUndead はすべて IEntity から継承されていることに注意してください。
public class EntityBucket
{
public LinkedList<IEntity> undeadEntities;
public LinkedList<IEntity> objects;
public LinkedList<IEntity> livingEntities;
public EntityBucket()
{
undeadEntities = new LinkedList<IEntity>();
objects = new LinkedList<IEntity>();
livingEntities = new LinkedList<IEntity>();
}
public LinkedList<IEntity> GetList(IObject e)
{
return objects;
}
public LinkedList<IEntity> GetList(IUndead e)
{
return undeadEntities;
}
public LinkedList<IEntity> GetList(ILiving e)
{
return livingEntities;
}
}
現在、パラメーターに基づいて、各リストを取得するための 3 つの方法があります。各リストには何らかの方法で独自のアクセサーが必要になることがわかっているため、3 つあるという事実は問題ありません。ただし、インスタンス化されたオブジェクトを渡すのは理想的ではありません。同様のタイプのオブジェクトが手元になくても、どこかでリストを取得したい場合があるからです。ここのオブジェクトは GetList メソッドでも使用されないことに注意してください。使用するバージョンを決定するためだけに存在します。インスタンス化されたオブジェクトが手元にある例を次に示します。
public void Delete(IUndead e, World world)
{
.....
LinkedList<IEntity> list = buckets[k].GetList(e);
.....
}
インスタンス化されたオブジェクトが手元にあるとは限らないため (たとえば、エンティティをレンダリングするとき)、この現在の実装は好きではありません。私はそれを一般的に行うことを考えていましたが、私がやりたいことでこれが可能かどうかはわかりません。これに伴い、3 つの Delete メソッド (および add などのその他の 3 つのメソッド) も必要です。IUndead、IObject、および ILiving の各タイプに 1 つです。これは正しいやり方ではないと感じています。
リクエストがあれば、これまでに試したことを投稿しますが、私のジェネリックはかなり悪いので、これを読むのはもったいないと感じています。
最後に、パフォーマンスは非常に重要です。私は時期尚早に最適化しているのではなく、既にコードが動作しているので最適化後に行っていますが、高速化する必要があります。getlist メソッドは非常に頻繁に呼び出されるため、明示的な型チェックは避けたいと考えています。