我目前正在为简单的游戏编写一个库,主要是供我自己使用。 现在我遇到了一个问题。我有一个名为“Game”的课程,如下所示:
class Game
{
private List<Entity> entities;
private int counter;
public Game()
{
entities = new List<Entity>();
counter = 0;
}
public AddEntity(Entity entity_)
{
entities.Add(entity_);
// problem! how to inform entity_ that it was added?
counter++;
}
}
实体是一个类,每个在游戏中起作用的对象都必须从中派生出来。它的内容并不重要。我正在寻找的是游戏通知新添加的entity_类有关其所有者(当前游戏实例)及其ID(这是“计数器”用于)的方式。现在我一直在考虑使用一个接口,它有一个方法“OnAdd(Game owner_,int id_)”,因为那肯定会有效,但我想确保没有首选方法。这是我的问题:
我的问题是否比接口有更好的解决方案? Entity实例不知道它被添加到哪个Game实例,并且使用类似事件的方法在我眼中感觉不对。如果当然我可能是错的。
答案 0 :(得分:3)
如果您的Entity
具有Game
类型的属性,则无需使用事件即可轻松解决此问题:
... code ...
entities.Add(entity_);
entity_.AddToGame(this);
... code ...
然后在AddToGame
方法中,您将执行您在事件处理程序中执行的任何操作,现在不需要。
答案 1 :(得分:1)
是的,似乎是正确的。但需要增加差异。
界面 - 一旦更改,您需要追踪所有实施。
抽象类 - 可以声明虚函数,因此无需跟踪实现
答案 2 :(得分:0)
有很多解决方案。
您当然可以在.Add
:
entity_.HasBeenAdded();
另一个解决方案是“反转添加”。类似的东西:
实体类:
public Entity
{
...
public void AddTo(IList<Entity> list)
{
if (list == null)
{
throw new ArgumentNullException();
}
list.Add(this);
// Do some logic here, as you now know your object
// has been added.
}
}
...
entity_.AddTo(entities);