2013-05-10 50 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

相關問題