在没有订阅的情况下发射一个事件

时间:2012-02-24 15:53:00

标签: c# events interface

我目前正在为简单的游戏编写一个库,主要是供我自己使用。 现在我遇到了一个问题。我有一个名为“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实例,并且使用类似事件的方法在我眼中感觉不对。如果当然我可能是错的。

3 个答案:

答案 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);