Форум 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=208068)

LifeIsRhythm 02.06.2014 01:20

Расширить класс или изменить логику
 
В начале был класс... Нет, эти слова не из книги Мука о as4, это начало моего вопроса.
Задачей этого класса было обобщение работы некого множества других классов, но в определенный момент
я взял и разбил этот класс ещё на несколько логических блоков и унаследовал их по цепочки.
И вот импровизационный код одного из них, его задача получать объекты и манипулировать ими спустя некоторое время.
Код AS3:

package
{
        public class ClassForTimeDelay extends SuperClass
        {
                private var _tasksDelayTime:Array; // массив с тасками для задержки время
 
                public function get length():int
                {
                        return _tasksDelayTime.length;// геттер длины массива
                }
 
                //  сюда передаются объекты, время которых нужно отсрочить
                private function handler(object:Object):void
                {
                        //  тут что-то происходит с объектом
                        this.setDelayTime(object);
                }
 
                private function setDelayTime(object:Object):void
                {
                        //  создаю таск для выполнения тасков с задержкой времени
                        var callbackTask:CallbackTask = new CallbackTask(this.postHandling, object); /*CallbackTask(callbackTask, ...rest)*/
                        //  таск для выполнения калбека
                        var delayTimeForTask:TimeDelayTaskForTask = new TimeDelayTaskForTask(callbackTask, 1000); /*TimeDelayTaskForTask(task, delayTime)*/
                        //  подписываюсь под выполнение
                        delayTimeForTask.addEventListener(TaskEvent.EXECUTE, delayTimeForTask_executeHandler);
                        //  и помещаю таск в массив тасков для задержки времени
                        _tasksDelayTime[_tasksDelayTime.length] = delayTimeForTask;
                }
 
                //  в этот метод передается тот самый объект
                protected function postHandling(object:Object):void
                {
                        // тут я помещаю его в массив суппер-класса
                        super.objects[super.objects.length] = object;
                        // и сразу по добавлению мне нужно послать событие, чтобы из массива
                        // в супер классе взяли объект
                        super.dispatchEvent(new CustomEvent(CustomEvent.GO_NEXT));
                }
 
                // тут все подчищается...
                private function delayTimeForTask_executeHandler(event:TaskEvent):void
                {
                        var delayTimeForTask:TimeDelayTaskForTask = event.target as TimeDelayTaskForTask;
                        delayTimeForTask.removeEventListener(TaskEvent.EXECUTE, delayTimeForTask_executeHandler);
                        _tasksDelayTime.splice(_tasksDelayTime.indexOf(delayTimeForTask), 1);
                }
        }
}

Загвоздка в том, что когда посылается событие CustomEvent.GO_NEXT, которое говорит о том, что в массиве есть элемент с которым нужно сделать некое действие, геттер длины ещё не равен ноль, так-как обработчик
delayTimeForTask_executeHandler ещё не выполнен.
Решений, как мне видится, два - 1) перенести диспатч в обработчик delayTimeForTask_executeHandler, но это будет не айс из-за того, что диспатч не будет относится логически к обработчику, да и код в обработчике то же нехорошо.
2) И второй вариант, унаследоваться от TimeDelayTaskForTask и передавать в него сам объект, а в execute просто диспатчить о выполнении. Но с этим вариантом у меня много сомнений, я не уверен точно, что таск может быть просто классом-контейнером + классом-таймером одновременно.
Что посоветуете? Спасибо.

Котяра 02.06.2014 01:35

Посмотри на as3commons.async

LifeIsRhythm 02.06.2014 12:35

Цитата:

Посмотри на as3commons.async
А не подскажите, как это поможет?


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

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