Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Экземпляр какого класса придет в листенер (http://www.flasher.ru/forum/showthread.php?t=210409)

callme 11.03.2015 11:39

Экземпляр какого класса придет в листенер
 
Когда подписываешься на событие, как узнать экземпляр какого класса придет в листенер?

Можно, наверно, написать в комментарии к метатегу Event. Какие еще есть варианты?

UPDATED!
Не читайте эту тему. Читайте сразу продолжение.

http://www.flasher.ru/forum/showthread.php?t=210420

tsarapkabel 11.03.2015 12:10

Если я правильно вас понял, то event.currentTarget даёт ответ на вопрос.

faraday 11.03.2015 12:22

Странная задача, и скорее всего не правильная.
currentTarget - возвращает только тот объект на который вы подписались. target - работает и с детьми.
Так вы получите ссылку на объект который сгенерировал событие, дальше чтобы узнать по ней класс, используйте getQualifiedClassName

callme 11.03.2015 12:45

У меня другая задача.

Пример. Если собака проголодалась, она отправляет событие HungerEvent.

Код AS3:

var dog:Dog = new Dog();
dog.addEventListener(DogEvents.HUNGER, listener);
 
function listener( сноска* ):void
{
 
}

*как, не заглядывая в код собаки, узнать, что сюда придет экземпляр класса HungerEvent?

caseyryan 11.03.2015 12:51

А сюда в этом случае не придет никакого HungerEvent. Сюда придет DogEvents (если конечно DogEvents - это событие). Если же нет, то архитектура не правильная.
И зачем заглядывать в код собаки, если уже есть подписка на DogEvents.HUNGER?
Странная какая-то задача. Если нужно узнать на какие события можно вообще подписать собаку, то это делается указанием метатегов Event. В этом случае IDE покажет на какие события можно подписаться

п.с. У каждого события есть свойство type. Вот его и можно посмотреть. Но, опять же, если все правильно сделано, и код события написан не або как

callme 11.03.2015 13:17

А если такой пример.

Собака может родить либо щенка, либо котенка. При этом собака отправляет событие TransportEvent.

Код AS3:

public function TransportEvent(cargo:Object, type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
    super(type, bubbles, cancelable);
    _cargo = cargo;
}


Вариант реализации #1

Код AS3:

var dog:Dog = new Dog();
dog.addEventListener(DogEvents.DOG_BIRTH, listener);
 
function listener(event:TransportEvent)
{
 
}


Вариант реализации #2

Код AS3:

var dog:Dog = new Dog();
dog.addEventListener(TransportEvent.TRANSPORT, listener);
 
function listener(event:TransportEvent)
{
    if (event.cargo is Dog) ...
}


Какой из этих двух вариантов правильный и почему?



P.S. Переменная cargo типа Object потому что я не хочу создавать кучу классов, которые будут отличаться от TransportEvent только типом переменной cargo.

ZackMercury 11.03.2015 13:31

callme, caseyryan хотел сказать, что намного удобнее писать все данные в DogEvent и отправлять его. Отправлять другой ивент просто нелогично.
В смысле, что отправляйте тот ивент, на который подписываетесь, как в случае с любым нативным для платформы(MouseEvent.SOME_EVENT отправляет MouseEvent, KeyboardEvent.SOME_EVENT отправляет KeyboardEvent и т.д., а соответствующие пуш-событийные данные суются в KeyboardEvent.keyCode, MouseEvent.x/y)

callme 11.03.2015 14:08

Было

Код AS3:

package
{
        public class DogEvent
        {
                static public const DOG_BIRTH:String = "dogBirth";
        static public const CAT_BIRTH:String = "catBirth";               
        }
}

Стало

Код AS3:

package
{
        public class DogEvent extends TransportEvent
        {
                static public const DOG_BIRTH:String = "dogBirth";
        static public const CAT_BIRTH:String = "catBirth";               
 
                public function DogEvent(cargo:Object, type:String, bubbles:Boolean=false, cancelable:Boolean=false)
                {
                        super(cargo, type, bubbles, cancelable);
                }
        }
}

Не находите, что наследование выглядит как-то глупо?

caseyryan 11.03.2015 17:12

Они должны быть как минимум логичны.
Ну как может быть DogEvent.CAT_BIRTH ?
Собака рожает кота?
Вам нужно избавиться от такой ненужной путаницы. Константы событий должны быть ясными и понятными, а названия событий соответствовать объектам, которые их отправляют. И станет намного проще.
Если есть кот, то он должен порождать CatEvent.
Но еще логичнее в данном случае привязать события вообще к самому действию.
Например AnimalEvent.BIRTH, AnimalEvent.DEATH и т.д. А DogEvent и CatEvent использовать только для случаев. которые относятся конкретно к коту и собаке, и никак иначе. Например DogEvent.BARF или CatEvent.MEOW

callme 11.03.2015 18:36

Продолжение темы тут

dimarik 11.03.2015 21:48

Скорее, DogEvent.WOOF в контексте MEOW. А то получается, что собачка блюёт, а котейка мяучит =)

caseyryan 11.03.2015 21:51

dimarik, я и не заметил, что BARF вместо BARK написал :D
Четко подмечено))


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

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