![]() |
(сложный) Потеря наследования - моя вина или компилятора?
проект большой и классов много. но случилась непонятная проблема.
допустим класс Код AS1/AS2:
я уже всё перебробовал: - менял очередности импортов. - называл классы так что бы имя отцовского класса было первым по алфавиту например: "FIRST_ClassAsParent" и "SECOND_SimpleClass" - называл классы так чтобы имя отцовского классы было последним например: "SECOND_ClassAsParent" и "FIRST_SimpleClass" - писал полный путь до отцовского класса "dynamic class other.package.SimpleClass extends parent.ClassAsParent" единственно что помогает это other.package.SimpleClass.prototype.__proto__ = parent.ClassAsParent.prototype; но это не решение и я уверен на 200% что дело в чем-то другом и лучше решить проблему чем затыкать дыры. |
А почему экземпляр класса SimpleClass должен показывать, что он экземпляр своего предка (ClassAsParent)? Он и не будет это показывать, пока вы ему насильно не пропишите prototype.__proto__ = ...
А так правильно: Код:
trace(this instanceof SimpleClass); |
Это недостаток instanceof, в силу кривой реализации классов в AS1/AS2.
|
А на каком этапе наследования инстансоф становится якобы не ребенком суперкласса?
|
Цитата:
Код AS1/AS2:
Цитата:
дело в том что раньше SimpleClass работал и наследовался от ClassAsParent нормально. Тоесть методы ClassAsParent работали в SimpleClass, но в какой-то момент SimpleClass перестал наследоваться. Если вы грешите на instanceof. то такой код Код AS1/AS2:
я уже вторые сутки пытаюсь понять что именно привело к такому результату и как это исправить. неужели никто не сталкивался с такой проблемой? з.ы. компилирую в flash cs4. попробовал mtasc (версии 1.14) - результат такой же. Добавлено через 6 минут Цитата:
|
Возможно дело в этом:
Цитата:
add: А вообще попробуйте вместо Код:
trace(this instanceof ClassAsParent);Код:
trace(this.prototype.__proto__ == ClassAsParent.prototype) |
не удалось воспроизвести: упорно пишет что (this instanceof ClassAsParent) - true и методы родителя вызывает..
нужен живой пример трабла |
после запарок с классом SomeClass выяснилось что проблема с классом ClassAsParent так как все потомки потеряли наследование от него.
я кодю на Eclipse 3.4 (Ganymede) + FDT 3.1.0.11 Enterprise. Проект на AS2. Файл класса ClassAsParent был в кодировке винды (то бишь cp1251). Я работал совсем над другой частью проекта когда появились баги после компиляции. Долго искав, нашёл трабл в том что у класса потерялась наследственность. Парился,парился - пытался заставить наследоваться. Начал этот топик. Потом выяснилось что, что-то не то с классом родителя. Он компилируется без ошибок и в присутствует в swf но другие классы не хотят от него наследоваться. за последние несколько часов был непонятный прорыв в плане: 1. взял файл класса ClassAsParent 2. убрал весь функционал и методов. короче выкинул всё что можно. остались только строки вида public function someMethod(){return false;} 3. откомпилил - в CS4 - наследования нет. 4. удалил. 5. создал новый файл в кодировке utf8 (BOM) 6. перенес из файла "обрезанный фукнционал" в этот файл код класса. 7. откомпилировал 8. НАСЛЕДОВАНИЕ ПОЯВИЛОСЬ. 9. нарадостях начав грешить на кодировки и т.д. востанавливаю функционал класса. 10. компилирую - наследования нет.... 11. создаю новый файл в utf8 (BOM) с обрезаным функционалом (тоесть вернутся к пункту 5.) 12. компилирую 13. наследования нет сижу разбираюсь дальше Добавлено через 53 минуты нашёл строчку которая нарушает наследование: Код AS1/AS2:
Код AS1/AS2:
Код AS1/AS2:
есть у кого-нибудь почему так происходит? |
дал бы минимальный пример, который косит
каким боком здесь ActionBasic ? а если инициализацию _distMax перенести в конструктор тоже косит? |
Действительно, без минимального примера, который косит, врятли тут кто-то чем-то поможет.
|
Цитата:
Код AS1/AS2:
классы ActionBasic и Lib дал выше. если перенести инициализацию в констуктор то наследование сохраняется. Код AS1/AS2:
я так понимаю что я единственный кто с этим столкнулся. хотя любые идеи приветствуются |
>>если перенести инициализацию в констуктор то наследование сохраняется.
так надо перенести и не парится, с инициализацией свойств в классе в AS2 мутновато все.. |
Да нет, как инициализируются свойства в AS2 и вообще в AVM1 как раз понятно.
Тут мутно с порядком наследования, что от кого наследуется плюс пути к классам. |
вопрос не в том как инициализируются свойства, а в том когда и где они при этом хранятся
при инициализации в самом классе в коде инициализации создается свойство в prototype, для элементарных типов это проходит в любом раскладе, но для объектов (или ссылок) уже критично чтобы объект, поставляющий значение, уже существовал.., если его класс инициализируется позже, то имеем undefined.. еще один нюанс с этим же связанный: свойство неэлемнтарного типа всех экземпляров ссылается на один и тот же объект в прототипе при инициадизации в конструкторе все нормально: на момент создания все классы уже проинициализированы, в каждом экземпляре создается свой объект |
Цитата:
Создается мувиклип в библиотеке с id=__Packages.имя_Класса Это мувик с экспортом на первый фрейм и кодом в #initclip Код и собирает в _global нужную функцию-класс, прописывая в ее prototype наследуемые своейства (особенность для ФП6) Конечно, #initclip идет в порядке наследования классов, но не мудрено поставить его в тупик: Код:
class A { |
| Часовой пояс GMT +4, время: 09:08. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.