2013-07-29 5 views
1

Im пытается реализовать систему событий для игры, где есть классы, которые могут вести огонь или обрабатывать событие Wheter или нет они реализуют эти интерфейсы:Как реализовать систему событий

public interface IGameEvent<T> where T : EventArgs 
{ 
    event EventHandler<T> OnEvent; 
} 

public interface IGameHandler<T> where T : EventArgs 
{ 
    void OnEvent(object sender, T e); 
} 

все выглядели замечательно, пока я понял, что ни один класс не может реализовать более 1 IGameEvent , потому что это приведет к дубликата декларации,

Вот пример:

public class Event 
{ 
    public KeyPressEvent OnKeyPress; 
    public UpdateEvent OnUpdate; 

    public void AddHadler<T>(IGameEvent<T> eEvent , IGameHandler<T> eHandler) where T : EventArgs 
    { 
     eEvent.OnEvent += eHandler.OnEvent; 
    } 

    public void RemoveHandler<T>(IGameEvent<T> eEvent, IGameHandler<T> eHandler) where T : EventArgs 
    { 
     eEvent.OnEvent -= eHandler.OnEvent; 
    } 
} 

KeyPressEvent:

public class KeyPressEvent : IGameEvent<KeyPressEvent.KeyPressedEventArgs> 
{ 
    public class KeyPressedEventArgs : EventArgs 
    { 
     public KeyPressedEventArgs(Keys key) 
     { 
      Key = key; 
     } 

     public Keys Key { get; private set; } 
    } 

    public event EventHandler<KeyPressedEventArgs> OnEvent; 

    private void OnCheckForKeyPressed() //Example 
    { 
     if (OnEvent != null) 
      OnEvent(this, new KeyPressedEventArgs(Keys.Space)); 
    } 
} 

Было бы лучше, чтобы вручную сохранить suscribers в списке в EventSystem?

Как медленнее или быстрее, чем этот подход?

Спасибо!

ответ

1

Общий подход заключается в реализации шаблона агрегатора событий. Поиск в Google предоставит вам множество различных вариантов. Например, это может выглядеть так (что я сейчас использую):

interface IEventsAggrgator 
{ 
    //fires an event, reperesented by specific message 
    void Publish<TMessage>(TMessage message); 
    //adds object to the list of subscribers 
    void Subscribe(object listener); 
    //remove object from the list of subscribers 
    void Unsubscribe(object listener); 
} 

interface IHandler<TMessage> 
{ 
    //implement this in subscribers to handle specific messages 
    void Handle(TMessage message); 
} 
Смежные вопросы