2012-02-24 107 views
1

我目前正在编写一个简单的游戏库,主要是为我自己使用。 现在我遇到了一个问题。我有一个名为“游戏”类,它看起来是这样的:在没有订阅的情况下触发一个事件

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++; 
    } 
} 

实体是每个在游戏中的作用对象必须从派生的类。其内容并不重要。我正在寻找的是一种让Game向新添加的entity_类通知其拥有者(当前Game实例)和它的id(这就是“counter”)的方法。现在我一直在考虑使用一个接口,它会有一个方法“OnAdd(Game owner_,int id_)”,因为这肯定会起作用,但是我想确保没有首选的方法。所以这是我的问题:

有没有比接口更好的解决方案,我的问题? Entity实例不知道它被添加到哪个Game实例,并且使用类似事件的方法在我眼中感觉不对。如果课程可能会出错。

回答

3

如果您EntityGame类型的属性,可以很容易地解决这个问题,甚至没有使用事件:

... code ... 
entities.Add(entity_); 
entity_.AddToGame(this); 
... code ... 

然后在AddToGame方法中,您可以在事件处理程序中执行任何您现在不需要的操作。

+0

聪明。 +1用于对象责任的“翻转”。 – KeithS 2012-02-24 16:18:18

1

是的,似乎是正确的。但需要添加一个区别。

接口 - 一旦更改,您需要跟踪所有实现。

抽象类 - 虚拟函数可以声明所以没有必要跟踪为实现

+0

我不相信这是一个有效的论据,赞成一个接口的抽象类 – RichK 2012-02-24 16:09:15

+0

是上述提到的点假设? – Pankaj 2012-02-24 16:10:14

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); 
0

使用事件。

class AAA 
{ 
    private List<Entity> entities;  
    private int counter;  
    public event Action<int> addEntiEvent; 

    public AAA()  
    { 
      entities = new List<Entity>();  
      counter = 0;  
    }  
    public AddEntity(Entity entity_) 
    {   
      entities.Add(entity_); 

     // problem! how to inform entity_ that it was added?   
     counter++;  

     if(null != addEntityEvent) 
     { 
      addEntityEvent(counter); 
     } 
    } 
} 

class BBB 
{ 
AAA aaa = new AAA(); 

public BBB() 
{ 
    aaa.addEntityEvent += new Action(addEntityEvent); 
} 

void addEntityEvent(int _counter) 
{ 
    Console.WriteLine("ok counter = "_counter); 
} 

} 
相关问题