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

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

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

Регистрация: Jan 2007
Сообщений: 302
Attention Вопрос по свойству super и обработчику событий в пределах приватной функции

Здравствуйте, такой вопрос.

1.Если контейнер и элементы удаляются таким способом
Код AS3:
while (super.numChildren)
	        this.removeChildAt(0);
удалятся ли все элементы из рабочей области если вызывались по такому принципу.
Главный класс "Controller" из него вызывается класс(в нем создается объект класса) "UI_Connect",
В классе "UI_Connect" есть метод destructor() в котором и определяется
Код AS3:
while (super.numChildren)
		this.removeChildAt(0);
Из класса "UI_Connect" вызывается(создается объект класса) класс "UI_NewGame"
Если я вызову из класса "UI_NewGame" метод destructor() из класса "UI_Connect", сработает он по такому же приципу? Тоисть удалит ли все элементы интерфейса из рабочей области? Визуально элементы удаляются в обоих случаях, но удаляются ли они полностью?
Насколько я понимаю обычный класс есть наследником суперкласса, тоисть если я обращаюсь из super и удаляю элементы - удаляются элементы всех классов что есть на рабочей области?



2.Если я подписываюсь на создание события в пределах одной функции, после завершения функции обработчик события погибает? Или нужно его зачищать?
Просто создается три обработчика события на таймер, в трех приватных функциях
Код AS3:
var timer:Timer = new Timer(1400, 1);
	timer.start();
	timer.addEventListener(TimerEvent.TIMER, comboSpCount);
Мое мнение - он погибает, но все же решил переспросить. За принципами ООП, он должен гибнуть.


Спасибо заранее, надеюсь на ответ.


Последний раз редактировалось Killer_13; 31.01.2011 в 16:13.
Старый 31.01.2011, 16:19
shootkin вне форума Посмотреть профиль Отправить личное сообщение для shootkin Найти все сообщения от shootkin
  № 2  
Ответить с цитированием
shootkin

Регистрация: Apr 2010
Сообщений: 32
1. Во-первых, с чего бы это UI_NewGame должен подтирать UI_Connect когда есть контроллер? Во-вторых уже не важно.
2. Нет. Бред пишете.

Старый 31.01.2011, 16:27
Killer_13 вне форума Посмотреть профиль Отправить личное сообщение для Killer_13 Найти все сообщения от Killer_13
  № 3  
Ответить с цитированием
Killer_13
 
Аватар для Killer_13

Регистрация: Jan 2007
Сообщений: 302
Цитата:
Сообщение от shootkin Посмотреть сообщение
1. Во-первых, с чего бы это UI_NewGame должен подтирать UI_Connect когда есть контроллер? Во-вторых уже не важно.
2. Нет. Бред пишете.
1. Но срабатывает! Интересуюсь почему?

2. Почему бред? Необоснованные слова ничего не стоят, я собственно написал, чтоб знающие люди подсказали, а не сказали "true" || "false".
Если есть 3 функции

к примеру

Код AS3:
private function time1():void{
var timer:Timer = new Timer(1400, 1);
	timer.start();
	timer.addEventListener(TimerEvent.TIMER, comboSpCount1);
}
 
private function time2():void{
var timer:Timer = new Timer(1400, 1);
	timer.start();
	timer.addEventListener(TimerEvent.TIMER, comboSpCount2);
}
 
private function time3():void{
var timer:Timer = new Timer(1400, 1);
	timer.start();
	timer.addEventListener(TimerEvent.TIMER, comboSpCount3);
}
Как мне отписаться от трех определенных внутри функции обработчиков событий?

Если такой код вы считаете плохим, тогда как создать глобальный обьект типа Timer и подписывать на него 3 различных события через определенное время? Конструктор у таймера принимает только 2 значения.

Старый 31.01.2011, 16:41
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 4  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Отписаться как-то так
Код AS3:
private function comboSpCount1(event:TimerEvent) {
	(event.target as Timer).removeEventListener(TimerEvent.TIMER, comboSpCount1);
}
А еще есть setTimeout()
__________________
...вселенская грусть

Старый 31.01.2011, 16:44
Killer_13 вне форума Посмотреть профиль Отправить личное сообщение для Killer_13 Найти все сообщения от Killer_13
  № 5  
Ответить с цитированием
Killer_13
 
Аватар для Killer_13

Регистрация: Jan 2007
Сообщений: 302
Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
Отписаться как-то так
Код AS3:
private function comboSpCount1(event:TimerEvent) {
	(event.target as Timer).removeEventListener(TimerEvent.TIMER, comboSpCount1);
}
А еще есть setTimeout()
На счет этого понял. А по моему вопросу, в приватных функциях, обработчики сами удаляются или?

А на счет 1 вопроса?
Спасибо.

Старый 31.01.2011, 17:59
shootkin вне форума Посмотреть профиль Отправить личное сообщение для shootkin Найти все сообщения от shootkin
  № 6  
Ответить с цитированием
shootkin

Регистрация: Apr 2010
Сообщений: 32
Хорошо, распишу подробнее.
1. this.someMethod() и super.someMethod() ссылаются на один и тот же объект. Разница в том, что первый вызывает переопределенный метод, а второй - метод, который был определен в родительском классе, но оба эти метода выполняются над данными одного и того же объекта. Нет никакой разницы как откуда и каким образом вы вызываете UI_Connect.destructor() - и this и super в нем будут указывать именно на этот экземпляр UI_Connect.
Просто красивее, практичнее и логичнее было бы закрывать одно окно в контроллере, а не из другого окна (если предположить, что UI_Connect и UI_NewGame - это какие-то окна). UI_NewGame по идее вообще не должен иметь референс на UI_Connect. Раз уж у вас есть контроллер, то используйте его хоть как-нибудь.

2. Давайте по порядку: вы создаете локальный экземпляр класса Timer, подписываете на его ивент какой-то свой метод, запускаете таймер, функция завершается. Референс на созданный таймер вы после этого теряете, но сам экземпляр таймера конечно никем не убивается. По прошествии заданного интервала времени (примерно), невидимый вам таймер вызовет обработчик, который вы ему прописали. В обработчике лучше явным образом отписаться от ивента этого таймера как написал gloomyBrain чтобы сборщик мусора почистил этот таймер.
В чем вообще вопрос был? Если вы хотели, чтобы таймер сам отписал всех своих листенеров и убился после завершения функции только от того что эта функция приватная - то нет, ничего такго не будет. ООП тут ни при чем.
Вот, например, вы в приватной функции локально объявляете переменную типа Sprite, создаете ее экземпляр, рисуете в нем какой-нибудь квадрат и добавляете его не stage. Вы будете ожидать, что после завершения функции квадрат сам собой со stage удалится только потому что вы его нарисовали локально в приватной функции, да?

Старый 31.01.2011, 18:16
Killer_13 вне форума Посмотреть профиль Отправить личное сообщение для Killer_13 Найти все сообщения от Killer_13
  № 7  
Ответить с цитированием
Killer_13
 
Аватар для Killer_13

Регистрация: Jan 2007
Сообщений: 302
Цитата:
Сообщение от shootkin Посмотреть сообщение
Хорошо, распишу подробнее.
1. this.someMethod() и super.someMethod() ссылаются на один и тот же объект. Разница в том, что первый вызывает переопределенный метод, а второй - метод, который был определен в родительском классе, но оба эти метода выполняются над данными одного и того же объекта. Нет никакой разницы как откуда и каким образом вы вызываете UI_Connect.destructor() - и this и super в нем будут указывать именно на этот экземпляр UI_Connect.
Просто красивее, практичнее и логичнее было бы закрывать одно окно в контроллере, а не из другого окна (если предположить, что UI_Connect и UI_NewGame - это какие-то окна). UI_NewGame по идее вообще не должен иметь референс на UI_Connect. Раз уж у вас есть контроллер, то используйте его хоть как-нибудь.

2. Давайте по порядку: вы создаете локальный экземпляр класса Timer, подписываете на его ивент какой-то свой метод, запускаете таймер, функция завершается. Референс на созданный таймер вы после этого теряете, но сам экземпляр таймера конечно никем не убивается. По прошествии заданного интервала времени (примерно), невидимый вам таймер вызовет обработчик, который вы ему прописали. В обработчике лучше явным образом отписаться от ивента этого таймера как написал gloomyBrain чтобы сборщик мусора почистил этот таймер.
В чем вообще вопрос был? Если вы хотели, чтобы таймер сам отписал всех своих листенеров и убился после завершения функции только от того что эта функция приватная - то нет, ничего такго не будет. ООП тут ни при чем.
Вот, например, вы в приватной функции локально объявляете переменную типа Sprite, создаете ее экземпляр, рисуете в нем какой-нибудь квадрат и добавляете его не stage. Вы будете ожидать, что после завершения функции квадрат сам собой со stage удалится только потому что вы его нарисовали локально в приватной функции, да?
1. - приблизительно понял, сейчас все переделаю, а то у меня 5 классов и уже путаница.
2. - БРАВО! Прям в точку, а еще вспомнилось крылатое выражение "убить себя па стену".
Вы все прекрасно обьяснили. Я просто чуток сьехал на с++, где локальная переменная уничтожается при выходе из функции.

Спасибо огромное!

Старый 31.01.2011, 19:16
Killer_13 вне форума Посмотреть профиль Отправить личное сообщение для Killer_13 Найти все сообщения от Killer_13
  № 8  
Ответить с цитированием
Killer_13
 
Аватар для Killer_13

Регистрация: Jan 2007
Сообщений: 302
shootkin - небольшой вопросик по первому вопросу.
Если я правильно понял, то например class A extends MovieClip
тогда super.метод() будет вызван от класса MovieClip типо так получается... или..

Старый 31.01.2011, 20:03
shootkin вне форума Посмотреть профиль Отправить личное сообщение для shootkin Найти все сообщения от shootkin
  № 9  
Ответить с цитированием
shootkin

Регистрация: Apr 2010
Сообщений: 32
Цитата:
Сообщение от Killer_13 Посмотреть сообщение
shootkin - небольшой вопросик по первому вопросу.
Если я правильно понял, то например class A extends MovieClip
тогда super.метод() будет вызван от класса MovieClip типо так получается... или..
Да, именно так. Вот более развернутый пример:
Код AS3:
public class A extends Sprite
{
	override public function set alpha( value : Number ):void
	{
		// ничего не делаем
	}
 
	public function test():void
	{
		this.alpha = 0.5; // вызовет переопределенный метод, ничего не сделает
		super.alpha = 0.5; // вызовет метод родительского класса (Sprite), установит альфу как положено
	}
}

Старый 31.01.2011, 20:21
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 10  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Свои 4 копейки:
super гарантированно дёргает метод суперкласса, this дёргает метод этого класса. Но так как при наследовании текущий класс наследует методы суперкласса, this.someMethod() вполне может дёрнуть метод суперкласса.

В случае если ни numChildren, ни removeChildAt не переопределены, то нужно писать так:
Код AS3:
while (super.numChildren)
	        super.removeChildAt(0);
Или так, если super в проекте не пишут:
Код AS3:
while (this.numChildren)
	        this.removeChildAt(0);
Или вообще не писать.
Код AS3:
while (numChildren)
	        removeChildAt(0);
Обычно пишут первым и третим вариантами. В случае неперекрытых методов, конечно.

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

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

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


 


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


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