2013-05-10 4 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() будет называться во всех производных классах. Как это возможно? –

+0

@JorisKok Все эти производные классы. Существует ли один экземпляр любого производного типа или есть несколько экземпляров. Если так; вам понадобится шаблон наблюдателя (и upvote @MartinMulder). – Aphelion

Смежные вопросы