Вот как оно выглядит:
Код: Выделить всё
public class Screen
{
public virtual event Action ReturnRequest;
public Screen()
{ }
}
public class MainMenuScreen : Screen
{
public override event Action ReturnRequest;
public event Action ExitRequest;
public event Action NewGameRequest;
public event Action LoadRequest;
public event Action SaveRequest;
public MainMenuScreen(){}
}
public class DeathScreen : Screen
{
public override event Action ReturnRequest;
public event Action ExitRequest;
public DeathScreen(){}
}
Код: Выделить всё
public void ConnectAllScreenEvents(Screen screen)
{
screen.ReturnRequest += ReturnFromScreen;
if (screen.GetType() == typeof(MainMenuScreen))
{
MainMenuScreen _screen = screen as MainMenuScreen;
_screen.ExitRequest += Exit;
_screen.LoadRequest += DeSerializeGame;
_screen.NewGameRequest += NewGame;
_screen.SaveRequest += SerializeGame;
}
else if (screen.GetType() == typeof(DeathScreen))
{
DeathScreen _screen = screen as DeathScreen;
_screen.ExitRequest += Exit;
}
Этот код на самом деле работает нормально. Однако мне кажется, что это очень неуклюжая реализация. Очевидные проблемы заключаются в том, что дерево if/else будет становиться все больше и больше, чем больше экранов и событий я определяю. Также не возникает ошибки, если я забуду подключить или отключить определенное событие.
Итак. Я ищу умную однострочную программу, которая связывает ВСЕ события экрана с их обработчиками. Моя концепция такова:
- Каждый экран помещает все свои события в список под названием «Все действия». Пример:
Код: Выделить всё
public Action[] AllActions = new Action[4] { ExitRequest, NewGameRequest, LoadRequest, SaveRequest };
- Основная логика получает словарь, который сообщает, какое событие с чем связано.
< /li>
Код: Выделить всё
private Dictionary ActionToHandler= new Dictionary();
ActionToHandler.Add("ExitRequest", Exit);
ActionToHandler.Add("NewGameRequest", NewGame);
ActionToHandler.Add("LoadRequest", DeSerializeGame);
ActionToHandler.Add("SaveRequest", SerializeGame);
- Метод ConnectAllScreenEvents должен превратиться в нечто подобное;
Код: Выделить всё
public void ConnectAllScreenEvents(Screen screen)
{
screen.ReturnRequest += ReturnFromScreen;
for (int i = 0; i < screen.AllActions.Length; i++)
{
string actionName = screen.AllActions[i].ToString();
Action handler = ActionToSlot[actionName];
screen.AllActions[i] += handler;
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... e-handlers