2

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

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 
+0

Как отмечалось в @maxmc, это должен быть «открытый интерфейс IFooBar extends IFoo, IBar {', а не 'реализует' – Amarghosh

ответ

1

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

+0

, вы имеете в виду« extends », а не« реализуете » – maxmc

+0

@maxmc ya, исправлено.Я предполагаю, что ошибка _implemented_ OP :) – Amarghosh

1

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

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

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

+0

+1 Я согласен с кодом запаха ... – OXMO456

+0

Добавлена ​​специфика того, что я пытаюсь сделать, как вы предложили – Anders