Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 02.06.2014, 01:20
LifeIsRhythm вне форума Посмотреть профиль Отправить личное сообщение для LifeIsRhythm Найти все сообщения от LifeIsRhythm
  № 1  
Ответить с цитированием
LifeIsRhythm

Регистрация: May 2014
Сообщений: 182
По умолчанию Расширить класс или изменить логику

В начале был класс... Нет, эти слова не из книги Мука о 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
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 2  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Посмотри на as3commons.async
__________________
Отряд Котовскага

Старый 02.06.2014, 12:35
LifeIsRhythm вне форума Посмотреть профиль Отправить личное сообщение для LifeIsRhythm Найти все сообщения от LifeIsRhythm
  № 3  
Ответить с цитированием
LifeIsRhythm

Регистрация: May 2014
Сообщений: 182
Цитата:
Посмотри на as3commons.async
А не подскажите, как это поможет?

Создать новую тему Ответ Часовой пояс GMT +4, время: 16:08.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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