Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Разница при компиляции AS2 под FP6 и FP7 (http://www.flasher.ru/forum/showthread.php?t=117322)

voloshin_d 24.10.2008 12:51

Разница при компиляции AS2 под FP6 и FP7
 
Привет всем. Помогите разобраться в следующей ситуации:
Я создаю 2 класса в стиле AS2 - класс A:
Код:

class A
{
        public function A()
        {
                trace("class A");
        }
}

и класс B, который наследуется от первого класса:
Код:

class B extends A
{
        public function B()
        {
                super();
                trace("class B")
        }
}

В первом кадне временной шкалы объявляю экземпляр класса B:
Код:

trace("------ Frame 1");
var instanceB:B = new B();

При компиляции под Flash Player 6 в аутпуте я получаю следующее:
Код:

class A
------ Frame 1
class A
class B

т.е. я так понимаю, до выполнения кода в первом кадре создается еще один экземпляр класса A. Если скомпилировать под Flash Player 7 такого не происходит. Подскажите плыз с чем это связано и где можно почитать про эту особенность. Очень нужно.

chingachgoog 24.10.2008 16:04

super() в конструкторе класса B можно и не писать - если он опущен, то компилятор автоматом вставит его в первую строчку конструктора.

Возможно разница из-за различного механизма организации наследования:

Код:

//#initclip 1
// - при компиляции из "классов" AS2
// создаются мувики с экспортом скрипта в первый кадр с #initclip
// c записью функций-классов в объект _global

function A(par){
        trace("class A "+par);
}

function B(par2){
        this.__proto__.__proto__.constructor("fromB") // эмулятор super()       
        trace("class B "+par2);       
}

//B.prototype=new A("init") // наследование через new

B.prototype.__proto__=A.prototype // обычное наследование

//B.prototype.__proto__.constructor=A // задается автоматически

//#endinitclip

Bobj = new B("timeline"); // создание объекта через new

/*
Bobj={} // эмуляция создания объекта через new
Bobj.constructor=B
Bobj.__proto__ = Bobj.constructor.prototype

Bobj.constructor("timeline")
//*/

Если поменять закомментированность в выделенных цветом строчках кода, то и возникнет описанный выше эффект.

voloshin_d 24.10.2008 16:59

Цитата:

Сообщение от chingachgoog (Сообщение 772650)
super() в конструкторе класса B можно и не писать - если он опущен, то компилятор автоматом вставит его в первую строчку конструктора.

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

А собственно по вопросу: получается это особеннось компилятора, которую нельзя обойти?

chingachgoog 24.10.2008 17:40

Цитата:

Сообщение от voloshin_d (Сообщение 772663)
А собственно по вопросу: получается это особеннось компилятора, которую нельзя обойти?

Почему нельзя? Можно, например в конструкторе класса А проверять переданные аргументы, и если ничего не передано, то выходить через return.

Или собрать классы на AS1. :)

Или докопаться до причины - я не уверен, что дело обстоит именно так, как я в предыдущем посте написал. Может еще где особенность 6-й версии: как-нибудь по-другому работает new, super, _global или #initclip?

chingachgoog 11.02.2009 20:10

Кажется разобрался.

Это механизм публикации класса в swf так различается.
Дело в том, что компилятор под версией ФП6 добавляет в #initclip мувика-класса (с id в библиотеке вида __Packages.имя_Класса) вызов super(), а последующие версии компиляции вызов super не делают.


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

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