AS3: Как я могу требовать аргумент метода для реализации нескольких интерфейсов? - PullRequest
2 голосов
/ 04 мая 2010

Аргумент к моему методу func () должен реализовывать два несвязанных интерфейса IFoo и IBar. Есть ли лучший способ сделать это, чем объявить другой интерфейс только для этой цели, который наследуется от IFoo и IBar, и использовать этот интерфейс в качестве типа аргумента?

public interface IFooBar extends IFoo, IBar {
}

public function func(arg:IFooBar):void {
}

Я разрабатываю для Flash Player 9.

Особенности того, что я пытаюсь сделать:

Я пишу небольшую библиотеку классов, которые призваны помочь мне в разработке Flash-игр. Чтобы помочь в отладке и проверке результатов игры, библиотека требует, чтобы пользователь разбил игру на следующие компоненты:

  • rawInputProducer: создает события ввода устройства из событий флэш-ввода, сохраненных событий предыдущего сеанса или другого источника
  • rawInputProcessor: прослушивает ввод устройства и из них выдает пользовательские команды
  • gameController: слушает пользовательские команды и обновляет состояние игры
  • gameView: прослушивает изменения состояния игры из gameController и обновляет сцену

Все эти компоненты генерируют события (называемые «сообщениями», чтобы не путать их с флэш-событиями). Класс Engine запускает компоненты и запускает основной цикл.

Чтобы компоненты были настолько универсальными, насколько это возможно, Engine требует только, чтобы они реализовали IMessageDispatcher и ITickable. Я хочу написать классы, которые имеют IMessageDispatcher или ITickable. У меня также есть универсальный MessageDispatcher, который реализует IMessageDispatcher, что мои компоненты, вероятно, будут расширяться.

Исходный вопрос касается того, как я могу объявить метод, подобный следующему:

Engine.setGameController(controller: ITickable & IMessageDispatcher):void

Ответы [ 2 ]

1 голос
/ 05 мая 2010

Наличие интерфейса расширяет 2 несвязанных интерфейса только для того, чтобы вы могли «правильно» ввести параметр одной функции / метода, похоже на запах кода. Вы можете сойти с рук, но я думаю, что это может быть признаком проблемы дизайна.

Хотя я могу ошибаться, поскольку ничего не знаю о вашей конкретной проблеме. И я предполагаю, что и IFoo, и IBar не связаны, что может быть не так.

Возможно, если вы немного подробнее опишете свою проблему, что представляют собой эти интерфейсы и как рассматриваемый метод работает с объектом, реализующим оба интерфейса, другие люди могут предложить альтернативы вашему проекту (если это окажется необходимым). Но, как правило, если вы делаете это просто для того, чтобы компилятор был доволен, есть вероятность, что вы делаете что-то не так.

1 голос
/ 04 мая 2010

Объявление интерфейса, расширяющего оба (или все) требуемых интерфейса, является правильным способом сделать это.Я не могу придумать лучшего способа.

...