AS3: Зачем использовать MouseEvent в качестве функции Param, когда Event работает нормально? - PullRequest
5 голосов
/ 08 апреля 2011

Я всегда пытаюсь улучшить свои методы программирования, и одна моя привычка заставила меня подумать, что, возможно, это не лучший подход. При обработке вызовов функции MouseEvent у меня есть тенденция использовать Event над MouseEvent в параметрах.

Пример:

mc.addEventListener(MouseEvent.CLICK, handleClick);

private function handleClick(e:Event):void
{
     trace(e.currentTarget.name + " was Clicked");
}

Существуют ли какие-либо функции или свойства внутри MouseEvent, недоступные в классе Event, что делает использование MouseEvent более необходимым? Единственная причина, по которой я могу придумать самостоятельно, - строгое типизировать параметры ваших событий / функций.

Ответы [ 3 ]

11 голосов
/ 08 апреля 2011

Если вы не введете параметр как MouseEvent, вам просто нужно привести его как MouseEvent, чтобы получить доступ к свойствам, специфичным для подкласса MouseEvent. Например:

Это не сработает:

private function handleClick(e:Event):void
{
     trace("altKey down: "+e.altKey);
}

Но это будет:

 private function handleClick(e:MouseEvent):void
 {
     trace("altKey down: "+e.altKey);
 }

Однако так будет (не рекомендуется, см. Ниже):

 private function handleClick(e:Event):void
 {
     trace("altKey down: "+MouseEvent(e).altKey);
 }

Вообще говоря, вы хотите, чтобы тип параметра прослушивателя был настолько общим, насколько это необходимо, чтобы, если ваша функция вызывается с неправильным типом события, она не выполнялась очевидным образом.

Ваш пример работает, потому что currentTarget является свойством базового класса Event. Но ничто не мешает вашему handleClick получать и отвечать на IOErrorEvent или KeyboardEvent и делать то, чего вы не ожидаете, без сбоев (например, если вы случайно настроили его для прослушивания чего-то другого, кроме MouseEvent, что вы не сделали бы намеренно , но может произойти, если вы скопируете и вставите строку кода addEventListener и измените тип события, но забудете изменить функцию-обработчик ... такие вещи случаются).

2 голосов
/ 08 апреля 2011

это список информации, доступной для события :

  • типа: String
  • пузырьков: логический
  • отменяемый: логический

это список информации, доступной для MouseEvent :

  • тип: String
  • пузыри: Boolean
  • отменяемый: логический
  • localX: номер
  • localY: номер
  • relatedObject: InteractiveObject
  • ctrlKey: логический
  • altKey:Boolean
  • shiftKey: Boolean
  • buttonDown: Boolean
  • delta: int
  • commandKey: Boolean
  • controlKey: Boolean
  • clickCount: int

Как видите, MouseEvent содержит гораздо более специфические данные для события, чем универсальный Event объект.

что-то вроде следующего не получится:

private function mouseEventHandler(evt:Event):void
{
trace(evt.localX);
}
0 голосов
/ 08 апреля 2011

Объекты MouseEvent содержат информацию, выходящую за рамки объектов Event.То есть MouseEvent наследуется от Event.Использование Event работает в том смысле, что будет вызываться прослушиватель событий, но если вам нужны специфичные для мыши свойства события, то просто использование базового класса не сработает.

Другими словами, ответ на этот вопрос"да":

Есть ли какая-либо функциональность или свойства внутри MouseEvent, недоступные в классе Event, которые могут сделать использование MouseEvent более необходимым?

Ответ Адама даетВы пример сценария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...