0

グローバルなゲーム ステートが変化したときに、すべての派生クラスで関数を呼び出すにはどうすればよいですか?

public abstract class GameStateBehaviour {

    public event EventHandler<GameStateEvents> StateChanged;

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

}
4

2 に答える 2

1

状態の変化について他のクラスに通知したい場合は、「オブザーバー パターン」を使用します (参照: http://en.wikipedia.org/wiki/Observer_pattern )。次の 2 つのパーティがあります。

  • 一方の当事者は、状態を変更する「オブジェクト」です。彼は他の人に知らせる義務があります。
  • 相手は「観察者」です。複数の観察者がオブジェクトの状態変化を観察したいと考えています。だから彼らは知らされたいのです。

これを試して:

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)
     {
     }
}
于 2013-05-10T10:07:49.223 に答える
0

OnStateChangedmethod は、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);
    }
}

上記のソリューションは、独自のイベントを処理します。独自のイベントに応答するのではなく、テンプレート メソッド パターンを実装する方が良いと思います。ただし、イベントをどこでスローするかわからないと思います。

于 2013-05-10T10:03:01.613 に答える