|
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
Собственные события
Доброго.
Начал читать про собственные события, гугл/Мук, но что-то я до конца так и не понял что и как работает. Вот отрывок из Мука package { import flash.events.Event; public class ToggleEvent extends Event { public static const TOGGLE:String = "toggle"; public var isOn:Boolean; public function ToggleEvent(type:String, bubblts:Boolean = false, cancable:Boolean = false, isOn:Boolean = false) { super(type, bubblts, cancable); this.isOn = isOn; } public override function clone ():Event { return new ToggleEvent (type, bubbles, cancelable, isOn); //что мы туда возвращаем и зачем? } public override function toString ():String { return formatToString ("ToggleEvent", "bubbles", "cancable", "EventPhase", "isOn");//А это вообще не пойму для чего нужно } } } |
|
|||||
Lorem ipsum
|
public override function clone():Event { return new ToggleEvent(type, bubbles, cancelable, isOn); //что мы туда возвращаем и зачем? } А это для отладки. Не обязательно, но удобства может прибавить.
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
Цитата:
Цитата:
Добавлено через 3 минуты Почему String? Да, вываливает ошибку, если другой тип, но почему? Мы же только тут и задаём значение "toggle", тут ведь можно написать что угодно? |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Цитата:
Цитата:
__________________
Reality.getBounds(this); |
|
|||||
Lorem ipsum
|
Этот метод возвращает клон события (неожиданное поведение для метода с таким названием, isn't it?) — новый экземпляр класса ToggleEvent, у которого type, bubbles и cancelable (а в нашем кастомном событии еще и isOn) такие же. Если не переопределишь, то это будет новый экземпляр уже другого класса — Event (без isOn), как и определено в суперклассе Event, от которого ты наследуешь свой ToggleEvent.
Потому что в Event определено, что type должен быть типа String. Разумеется, можно сделать свой собственный type не строковым. Тогда при передаче его в качестве аргумента конструктора суперкласса (вот этот вот super(…) у тебя в конструкторе) просто придется дописать к нему .toString() (или сделать из не строкового type строку еще каким-то своим индивидуальным способом). Вот только зачем это нужно, если type — является лишь меткой, позволяющей понять, что именно за событие произошло. Если твоему событию нужен какой-то идентификатор (а это таки бывает нужно, когда доходит до кастомных событий) — сделай его еще одним полем класса ToggleEvent точно так же, как это сделано с полем isOn. Добавлено через 48 секунд P.S. Как мы синхронненько
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
спасибо, господа, что-то начинает прояснятся.
Вот код следующего класса из Мука, тот же пример идёт package { import flash.display.Sprite; public class ToggleSwitch extends Sprite { private var isOn:Boolean; public function ToggleSwitch() { isOn = false; } public function toggle():void { isOn = !isOn; dispatchEvent(new ToggleEvent(ToggleEvent.TOGGLE, true, false, isOn));//вот тут не ясно, //мы тут получается в "ручную" объявляет о свершении события //т.е. все слушатели, которые подписаны на это событие, получат его, так? //Но чтобы объявить о событии, мы должны в ручную вызвать функцию "toggle()"? } } } |
|
|||||
Lorem ipsum
|
Скорее дела обстоят так. Мы вызываем у экземпляра класса ToggleSwitch метод toggle(), который переключает туда-сюда состояние isOn. Так вот если бы не dispatchEvent(…), то все происходило бы по-тихому. Даже более: из-за того, что поле isOn приватное, о его состоянии снаружи вообще никак было бы не узнать (ну, за некоторым исключением, которое здесь несущественно).
Выходит, что при "щелчке" (вызове vетода toggle) согласно архитектуре приложения-примера из книжки нужно всякий раз сообщать всем заинтересованным*, что isOn сменил значение, и, что самое важное, еще и указать, какое именно значение сейчас имеет этот самый isOn. Это конечно лучше было сделать по-другому (в данном случае). Но для примера автор решил показать, как можно это значение передать через кастомное событие, которое не только сообщает смене значения определенного поля, но и содержит это значение. * Под заинтересованными понимаются все, кто подписался на это событие от этого экземпляра класса ToggleSwitch или кого-то из его родителей, потому что ToggleSwitch наследуется от Sprite, а событие посылается с разрешением на "всплытие" — второй аргумент в конструкторе new ToggleEvent(…) — true.
__________________
Поймай яблоко 2! |
|
|||||
Цитата:
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Мне кажется, это вопрос скорее о телепатии. Вопрос о том, откуда берутся события. Поскольку до того, как впервые сделать своё собственное событие, мы только ловили уже готовые, непонятно откуда взявшиеся, у многих новичков есть такое интуитивное "понимание", что события сами собой возникают и рассылаются "на каждый чих", типа — поменяли координату у клипа на 1 пиксель — можно поймать какое-то событие об этом в другом месте (подразумевается "в любом другом месте" ), надо только понять, какое)) Необходимость посылать свое событие "вручную" кажется какой-то нелепостью, ведь до этого события нужны были, чтобы о чем-то "узнать", а тут получается какая-то "бессмысленная" система — узнал о чем-то –> послал событие. Потому что мозг еще не думает о том, что находится вне класса, о том что кто-то ТАМ хотел бы тоже "узнать" и именно для них мы создаем и посылаем Событие.
и да, функция таки должна называться switch (переключить, поменять состояние), а не toggle (традиционно используется для указания, что нужно сохранить, зафиксировать состояние)
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
Wolsh значит вариант телепатии прокатит, если в класс добавить слушатель, к примеру, энтер_фрейм, с помощью которого мы будем проверять, поменялся ли isOn, и в случаи изменения - диспатчить событие, так? Я хочу уменьшить зависимости кода, как вариант правильно?
|
Часовой пояс GMT +4, время: 00:48. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|