Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   один прёмник для 2х типов событий (http://www.flasher.ru/forum/showthread.php?t=146008)

Contemplator 26.10.2010 09:47

один прёмник для 2х типов событий
 
Собственно как описать один приёмник для двух событий разных типов, не исключая при этом типизацию данных и не описывая некую вспомогательную функцию, которая бы вызывалась в обоих приемниках (второе не нравится лишней писаниной)?
Код AS3:

addEventListener(MouseEvent.MOUSE_OVER, someFunction);
addEventListener(FocusEvent.FOCUS_IN, someFunction);
.....
private function someFunction(e:*):void {
    .....
}
.....


f.g.programmer 26.10.2010 10:01

Код AS3:

private function someFunction(e:Event):void {...


Contemplator 26.10.2010 11:45

Цитата:

Сообщение от f.g.programmer (Сообщение 945447)
Код AS3:

private function someFunction(e:Event):void {...


т.е. я правильно понял: Event является суперклассом для MouseEvent и FocusEvent и поэтому такое объявление типа данных событийного объекта будет справедливым? =)
или всё же каша у меня в голове сейчас?

alatar 26.10.2010 12:19

Все события наследуюся от Event.

Psycho Tiger 26.10.2010 15:42

Цитата:

Сообщение от Contemplator (Сообщение 945473)
т.е. я правильно понял: Event является суперклассом для MouseEvent и FocusEvent и поэтому такое объявление типа данных событийного объекта будет справедливым? =)
или всё же каша у меня в голове сейчас?

Каши нет, всё верно.

Contemplator 26.10.2010 19:13

Цитата:

Сообщение от Psycho Tiger (Сообщение 945529)
Каши нет, всё верно.

хмм... резонный вопрос назрел: в каких случаях тогда следует указывать явный тип данных, соответствующий конкретному событию? или это из серии: глянул в код через полгода-год и понял к какому именно событию относится данный приёмник и где искать слушатель?

alatar 26.10.2010 19:29

Цитата:

в каких случаях тогда следует указывать явный тип данных
Во всех, где возможно. В вашем случае прийдется приводить событие к конкретному типу (предварительно проверив какое событие пришло), если понадобится обратиться к свойствам MouseEvent или FocusEvent.

Contemplator 26.10.2010 22:55

Цитата:

Сообщение от alatar (Сообщение 945580)
Во всех, где возможно. В вашем случае прийдется приводить событие к конкретному типу (предварительно проверив какое событие пришло), если понадобится обратиться к свойствам MouseEvent или FocusEvent.

т.е. иными словами если в приёмнике нет необходимости в получении информации, касающейся произошедшего события, и приёмник один для нескольких событий - типом данных событийного объекта объявляем Event. В противном случае, применимо к вышеописанному коду следовало писать что-то вроде:
Код AS3:

private function someFunction(e:Event):void {
          if(e is MouseEvent){
          MouseEvent(e);
          /*обращаемся к переменным и свойствам MouseEvent*/
          } else {
          FocusEvent(e);
          /*обращаемся к переменным и свойствам FocusEvent*/
          }
}

или как-то иначе производиться должны проверка реального типа данных события и его приведения к нему?

expl 26.10.2010 23:05

Можно еще так:
Код AS3:

var mouseEvent:MouseEvent = e as MouseEvent;
if (mouseEvent != null)
{
  ...
}
var focusEvent:FocusEvent = e as FocusEvent
if (focusEvent != null)
{
  ...
}

Но суть от этого не меняется.
Однако, я бы не стал делать один приемник на несколько событий, а потом лепить там свичи и всяческие ифы - это ООП наоборот получается.

Если есть одинаковый код в 2-х обработчиках - сделайте по-человечески - вынесите его в метод и вызывайте в этих обработчиках метод

Подписка одного обработчика на 2 события оправдана только если внутри него нет приведений типов, т.е. НЕ рассматриваются данные, пришедшие в e:Event (специфические для конкретных типов событий) вообще.

Contemplator 26.10.2010 23:17

Цитата:

Сообщение от expl (Сообщение 945629)
т.е. НЕ рассматриваются данные, пришедшие в e:Event (специфические для конкретных типов событий) вообще.

ну как бы да, - изначально смысл был в этом (при наведении мыши или получением фокуса - просто изменить графическое содержимое), - дальше уже пошёл чисто академический интерес ;)

всем спасибо за помощь ;)


Часовой пояс GMT +4, время: 08:13.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.