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

SmartFox 22.11.2012 17:18

Конструктор главного класса приложения
 
Всем доброго времени суток!

Я заметил, что во многих туториалах по AS3 избегают проводить всю необходимую инициализацию
в конструкторе главного класса приложения. Вместо этого создают отдельную функцию и вызывают
ее по наступлению события ADDED_TO_STAGE. Почему?

Flash Develop вообще по-умолчанию генерирует такой код:
Код AS3:

if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);

Т.е., как я понимаю, объект stage может еще не существовать к моменту создания объекта нашего класса?
Я всегда всю инициализации проводил в конструкторе и проблем не было...

КорДум 22.11.2012 17:23

Цитата:

Т.е., как я понимаю, объект stage может еще не существовать к моменту создания объекта нашего класса?
Когда флешка загружается в другую, stage у нее не доступен сразу.

Цитата:

Я всегда всю инициализации проводил в конструкторе
Код в конструкторе интерпретируется FP каждый раз, когда его вызов встречается в коде, вместо того, чтобы кэшировать в памяти все интерпретированное, что происходит с методами, например. Поэтому тратится больше времени на вызов конструктора.

SmartFox 22.11.2012 17:32

Цитата:

Сообщение от КорДум (Сообщение 1105636)
Когда флешка загружается в другую, stage у нее не доступен сразу.

Мм... т.е. если я не использую обращение к stage в коде инициализации или если я не планирую
загружать данную флешку внутрь другой, то можно всю инициализацию в конструктор пихать?

Цитата:

Сообщение от КорДум (Сообщение 1105636)
Код в конструкторе интерпретируется FP каждый раз, когда его вызов встречается в коде, вместо того, чтобы кэшировать в памяти все интерпретированное

Но встречается-то он всего один раз! Это же основной класс и создается всего один его объект.

Zebestov 22.11.2012 17:36

Если ты не планируешь проверять наличие stage в конструкторе с последующим алертом типа "ай-ай-ай!!!", то можно опустить этот блок и производить инициализацию прямо в конструкторе. Главное не отвыкнуть от хорошего и не делать так в других классах отображения.

SmartFox 22.11.2012 17:37

Понятно. Спасибо.

Правильно ли я понял, что лучше вообще всю инициализацию из конструкторов выносить,
потому что их код не кешируется?

т.е. всегда лучше написать покрайней мере так:
Код AS3:

public function ClassName () : void
{
    init ();
}
 
private function init () { /*initialization*/ }

И это будет быстрее если объекты класс ClassName создаются регулярно в процессе выполнения?

illuzor 22.11.2012 17:49

SmartFox, вы не уловили суть. Нужно убедиться, что stage доступен и уже после этого запускать основной код.

SmartFox 22.11.2012 17:53

Цитата:

Сообщение от illuzor (Сообщение 1105646)
SmartFox, вы не уловили суть. Нужно убедиться, что stage доступен и уже после этого запускать основной код.

Об этом я как раз догадался по строке if (stage) init(); в коде из Flash Develop. Просто меню удивило, что среда выполнения может создать объект моего класса до того, как создала stage. Оказывается может.

AlexCooper 22.11.2012 18:08

прошу не путать грешное с праведным.

Стейдж экземпляр получает тогда когда добавлен на сцену. если быть точным после выполнения комманды
Код AS3:

addChild();


dimarik 22.11.2012 18:10

AlexCooper. Есть частный случай. В primary документ-классе, который является корневым, stage доступен в конструкторе.

AlexCooper 22.11.2012 18:12

Пример

Код AS3:

var test = new inits();
trace(test.DATA); // 0
addChild(test);
trace(test.DATA); // 1

Код AS3:

package  {
 
        public class inits {
 
                public var DATA:Number = 0;
 
                public function inits() {
                        if (stage) init()
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event):void {
                        DATA = 1;
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                }
 
        }
 
}

Добавлено через 1 минуту
Цитата:

Сообщение от dimarik (Сообщение 1105650)
AlexCooper. Есть частный случай. В primary документ-классе, который является корневым, stage доступен в конструкторе.

C этим согласен, так как корневой "Main" сам себя добавляет на сцену и ему не нужен
Код AS3:

addChild()



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

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