| 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 просто диспатчить о выполнении. Но с этим вариантом у меня много сомнений, я не уверен точно, что таск может быть просто классом-контейнером + классом-таймером одновременно.
Что посоветуете? Спасибо.
|