Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вопрос по свойству super и обработчику событий в пределах приватной функции (http://www.flasher.ru/forum/showthread.php?t=149781)

Killer_13 31.01.2011 15:43

Вопрос по свойству 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);

Мое мнение - он погибает, но все же решил переспросить. За принципами ООП, он должен гибнуть.


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

shootkin 31.01.2011 16:19

1. Во-первых, с чего бы это UI_NewGame должен подтирать UI_Connect когда есть контроллер? Во-вторых уже не важно.
2. Нет. Бред пишете.

Killer_13 31.01.2011 16:27

Цитата:

Сообщение от shootkin (Сообщение 969303)
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 значения.

gloomyBrain 31.01.2011 16:41

Отписаться как-то так
Код AS3:

private function comboSpCount1(event:TimerEvent) {
        (event.target as Timer).removeEventListener(TimerEvent.TIMER, comboSpCount1);
}

А еще есть setTimeout()

Killer_13 31.01.2011 16:44

Цитата:

Сообщение от gloomyBrain (Сообщение 969307)
Отписаться как-то так
Код AS3:

private function comboSpCount1(event:TimerEvent) {
        (event.target as Timer).removeEventListener(TimerEvent.TIMER, comboSpCount1);
}

А еще есть setTimeout()

На счет этого понял. А по моему вопросу, в приватных функциях, обработчики сами удаляются или?

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

shootkin 31.01.2011 17:59

Хорошо, распишу подробнее.
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 удалится только потому что вы его нарисовали локально в приватной функции, да?

Killer_13 31.01.2011 18:16

Цитата:

Сообщение от shootkin (Сообщение 969327)
Хорошо, распишу подробнее.
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. - БРАВО! Прям в точку, а еще вспомнилось крылатое выражение "убить себя па стену". :):):):)
Вы все прекрасно обьяснили. :):):) Я просто чуток сьехал на с++, где локальная переменная уничтожается при выходе из функции. :):)

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

Killer_13 31.01.2011 19:16

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

shootkin 31.01.2011 20:03

Цитата:

Сообщение от Killer_13 (Сообщение 969339)
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), установит альфу как положено
        }
}


Psycho Tiger 31.01.2011 20:21

Свои 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, время: 19:30.

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