在c#中调用多个派生类中的函数

时间:2013-05-10 09:45:09

标签: c# unity3d abstract derived

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

public abstract class GameStateBehaviour {

    public event EventHandler<GameStateEvents> StateChanged;

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

}

2 个答案:

答案 0 :(得分: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)
     {
     }
}

答案 1 :(得分:0)

OnStateChanged方法是应该触发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);
    }
}

上面的解决方案处理您自己的事件。我认为实现模板方法模式更好,而不是响应您自己的事件。但是我认为你不确定在哪里举办活动。