2013-05-10 75 views
0

当全局游戏状态发生变化时,如何在所有派生类中调用函数?在c中调用多个派生类中的函数#

public abstract class GameStateBehaviour { 

    public event EventHandler<GameStateEvents> StateChanged; 

    protected virtual void OnStateChanged(GameStateEvents e) { 
     // Call this function in all derived 
    } 

} 

回答

1

如果您想通知其他课程关于状态更改,我们使用'观察者模式'(请参阅:http://en.wikipedia.org/wiki/Observer_pattern)。有两方:

  • 一方是“对象”,它将改变状态。他有责任通知其他人。
  • 对方是“观察者”。多个观察者希望观察对象的状态变化。所以他们想要被告知。

试试这个:

class TheObject 
{ 
    public event EventHandler<GameStateEvents> StateChanged; 

    // If your object changes state, this function should be called. It informs all observers by invoking the StateChanged delegate. 
    protected virtual void OnStateChanged(GameStateEvents e) 
    { 
     if (StateChanged != null) 
      StateChanged(this, e); 
    } 
} 

class TheObserver 
{ 
    public TheObserver(TheObject o) 
    { 
     o.StateChanged += Object_StateChanged; 
    } 

    // This function is called by the object when the object changes state. 
    private void Object_StateChanged(object sender, GameStateEvents e) 
    { 
    } 
} 
0

方法是应该触发StateChanged事件的方法。不是处理此事件的方法。这就是为什么我添加了FunctionCalledWhenStateChanges方法。

public abstract class GameStateBehaviour 
{ 
    public event EventHandler<GameStateEvents> StateChanged; 

    protected GameStateBehaviour() 
    { 
     StateChanged += (sender, events) => FunctionCalledWhenStateChanges(); 
    } 

    public virtual void FunctionCalledWhenStateChanges() 
    { 
     // The called function 
    } 

    protected void OnStateChanged(GameStateEvents e) 
    { 
     if (StateChanged != null) StateChanged(this, e); 
    } 
} 

上述解决方案处理您自己的事件。我认为实现模板方法模式更好,而不是响应你自己的事件。不过,我认为你不确定在哪里抛出这个事件。

+0

奥凯,但当时如果我调用此函数从任何一类,我想FunctionCalledWhenStateChanges()在所有派生类中调用。这将如何成为可能? – 2013-05-10 10:10:47

+0

@JorisKok所有这些派生类。是否有任何派生类型的单个实例,或者是否存在多个实例?如果是这样;你将需要观察者模式(和upvote @MartinMulder)。 – Aphelion 2013-05-10 10:13:44

相关问题