gpt4 book ai didi

C#,访问类中不同列表的通用方法

转载 作者:太空狗 更新时间:2023-10-29 23:16:53 24 4
gpt4 key购买 nike

我有一类 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 方法(以及 3 个任何其他方法,例如添加等)- 每种类型一个,IUndead、IObject 和 ILiving。我只是觉得这不是正确的做法。

我会根据要求发布到目前为止我尝试做的事情,但我的泛型相当糟糕,我觉得任何人也阅读这篇文章都是浪费。

最后,性能非常重要。我没有过早优化,我正在进行后期优化,因为我已经有了工作代码,但需要它运行得更快。 getlist 方法将被频繁调用,我想避免任何显式类型检查。

最佳答案

所以你想要一个更好的接口(interface),因为正如你所说,将一个不必要的对象传递给 GetList仅仅弄清楚它的类型是没有意义的。

你可以这样做:

public List<IEntity> GetList<T>() : where T:IEntity
{
if(typeof(T)==typeof(IUndead)) return undedEntities;
// and so on
}

你必须这样调用它:GetList<IUndead>();

我认为枚举在这里是个更好的主意:

enum EntityTypes { Undead, Alive, Object };
public List<IEntity> GetList(EntityTypes entityType) { ... }

它更干净,对我来说更有意义。

编辑:使用泛型实际上并不是那么简单。有人可以将 GetList 称为 Zombie类型,它实现了 IUndead,然后你必须检查接口(interface)实现。有人甚至可以给你一个 LiveZombie它实现了 IUndead 和 IAlive。一定要使用枚举。

关于C#,访问类中不同列表的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10625887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com