Форум 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)
-   -   не работает наследование (http://www.flasher.ru/forum/showthread.php?t=103055)

expl 28.10.2007 12:09

не работает наследование
 
Доброго времени суток!
уже часа 3 воюю с flash-компилятором, mtasc все правильно делает, родной флешевский компилятор не хочет.
Есть 3 класса:
Код:

...
import view.Contourable;
...
class view.Platform extends MovieClip implements Contourable {
        ...
        function Platform() {
                trace("CONSTRUCTOR_PLATFORM");
                platforms.push(this);
                _name="#platform"+(index=platforms.length-1);
                getContour().draw(0xff0000);//?
        }
        ...
}

Код:

...
import view.Platform;
...
class view.Bonus extends Platform {
        ...
        function Bonus() {
                trace("CONSTRUCTOR_BONUS");
        }
        ...
}

Код:

import view.Bonus;
class view.Detail extends Bonus {
        static var curDetail:Detail=null;
        function Detail() {
                curDetail=this;
                trace("CONSTRUCTOR");
        }
        function setDetail(level:Number) {
                gotoAndStop(level);
        }
}

В Linkage мувиклипа прописываю Detail, выкладываю на линейку:
конструктор Detail запускается, а конструкторы Bonus и Platform - нет.

Причем если унаследовать Detail от Platform - все работает.

Что это за особенность такая flash-компилятора и как с ней бороться?

udaaff 28.10.2007 12:46

Попробуйте принудительно его вызвать. Хотя, вроде и так все должно работать.
Код:

function Detail() {
        super();
        curDetail = this;
        trace("CONSTRUCTOR");
}

ps: Выложите пример, чтобы протестировать можно было.

expl 28.10.2007 13:10

Вложений: 1
Пробовал, не помогает,
исходник:
Вложение 18089

screamge 28.10.2007 15:23

Я вам советую всегда строить мини примеры, оставлять только нужное и проверять если возникают сомнения в функциональности.

http://www.screamge.com/files/extend.rar

wvxvw 28.10.2007 15:37

Просто в паблиш сеттингс укажи путь к папке view, у меня все откомпилировалось

expl 28.10.2007 16:11

2 screamge:
отдельно мувик протестировал - работает!
- вся цепочка конструкторов запусается

что-ж такого в связке накурочал - мыслей никаких, mtasс ведь правильно все компилит
придется плясать с бубном, переставлять мувики


wvxvw: попробовал - ни какой реакции

зато стоит добавить мувики из промежуточной цепочки наследования (дополнить промежуточный класс библиотечным символом)
- начинают пропускаться вызовы конструкторов
- пропуск вызовов конструкторов начинает зависеть от глубины расположения мувиков на экране и просто от наличия символа в библиотеке

screamge 28.10.2007 16:39

пожалуйста объединяйте друг за другом следующие сообщения. Для этого есть кнопка «изменить».

wvxvw 28.10.2007 16:52

Компилил в ЦС3 - там все норм, вечером прийду домой, попробую в восьмерке.
======================================================== upd ==
Вот, пришел домой. И вправду не компилится...
Зато придумал, как конструктор вызвать %)
new Bonus(); :D :D :D Вопрос ток зачем =)
Просто, очевидно, конструктор будет вызываться либо при наличии мувика на сцене, либо при создании програмно нового инстанса, а в остальных случаях - проигнорируется.

Да, вот еще давно хотел спросить. Видел такую же штуку в чужем коде - не понял к чему. Зачем объявлять конструктор как приватную функцию? Она ведь все равно такой не будет?

================================= upd2 ======================
Построил простенький примерчик с таким же наследованием, все вроде работает, но появилась другая мысль...
Возможно, в связи с тем, что код частично не в юникодах где-то имеет место быть несоответствие имен? (у меня коменты на русском выглядят как иероглифы %)
=========================== upd3 =========================
Вобщем, умаялся... должно работать, а не работает... хз почему =/
Да, еще вот такая странная штука, на попытку trace(super) из класса Detail получился вот такой неожиданный результат:
_level0.instance1.#level.instance3

expl 29.10.2007 20:34

Цитата:

Зачем объявлять конструктор как приватную функцию?
ну чтобы не отвлекаться на нее, когда делаешь остальной код - все равно на прямую вызывать его нет смысла, хотя код грязный, там private практически случайно ставился
Цитата:

Зато придумал, как конструктор вызвать %)
new Bonus(); Вопрос ток зачем =)
пробывал писать такое:
Код:

prototype=new Bonus()
конструктор то вызывается, а мувиклип им не обрабатывается - результата нет
пробывал так:
Код:

__proto__=Platform.prototype;//?
var f:Function=Platform;//?
f.apply(this);//?

- вобще не работает
Цитата:

Вот, пришел домой. И вправду не компилится...
у меня и на CS3 то же самое: компилиться конечно копмилится, но наследоваться не наследуется
Цитата:

Возможно, в связи с тем, что код частично не в юникодах где-то имеет место быть несоответствие имен?
все в UTF-8 конвертнул - без изменений
Короче нужно учить заказчика mtascом пользоваться, или как-то решать проблему окольными путями, а пока не пришла светлая мысля устранять кучу других багов.
Но вот эта философия работы наследования с мувиклипами просто убивает

wvxvw 29.10.2007 21:04

Смотри, если по честному, я бы попробовал переписал так, чтобы не наследовать Платформ от МувиКлипа (хз, но по идее должно помочь...) А еще лучше - не создавать инстасы классов аттачем/выкладыванием на сцену... никогда не любил этот способ, вот нашел лишнее тому подтверждение.


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

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