Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.02.2009, 20:33
camelot вне форума Посмотреть профиль Отправить личное сообщение для camelot Найти все сообщения от camelot
  № 1  
Ответить с цитированием
camelot

Регистрация: Jul 2006
Сообщений: 26
По умолчанию (сложный) Потеря наследования - моя вина или компилятора?

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

Код AS1/AS2:
import core.Library;
import some.package.Class;
import parent.ClassAsParent;
 
dynamic class other.package.SimpleClass extends ClassAsParent
{
 
  public function SimpleClass()
  {
    trace(this instanceof ClassAsParent);
  }
 
}
пишет "false"

я уже всё перебробовал:
- менял очередности импортов.
- называл классы так что бы имя отцовского класса было первым по алфавиту например: "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% что дело в чем-то другом и лучше решить проблему чем затыкать дыры.

Старый 10.02.2009, 20:49
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 2  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
А почему экземпляр класса SimpleClass должен показывать, что он экземпляр своего предка (ClassAsParent)? Он и не будет это показывать, пока вы ему насильно не пропишите prototype.__proto__ = ...
А так правильно:
Код:
trace(this instanceof SimpleClass);

Старый 10.02.2009, 23:34
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 3  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Это недостаток instanceof, в силу кривой реализации классов в AS1/AS2.

Старый 11.02.2009, 00:27
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 4  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
А на каком этапе наследования инстансоф становится якобы не ребенком суперкласса?
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 11.02.2009, 13:00
camelot вне форума Посмотреть профиль Отправить личное сообщение для camelot Найти все сообщения от camelot
  № 5  
Ответить с цитированием
camelot

Регистрация: Jul 2006
Сообщений: 26
Цитата:
Сообщение от chingachgoog Посмотреть сообщение
А почему экземпляр класса SimpleClass должен показывать, что он экземпляр своего предка (ClassAsParent)? Он и не будет это показывать, пока вы ему насильно не пропишите prototype.__proto__ = ...
А так правильно:
Код:
trace(this instanceof SimpleClass);
a extends в классе зачем, если каждому классу надо будет прописывать родителя руками в рантайме? я уже задумываюсь сделать и запускать вначале проигрывания swf. но это же не выход
Код AS1/AS2:
class Bubn
{
  public static function bindClasses()
  {
    other.package.SimpleClass.prototype.__proto__ = parent.ClassAsParent.prototype
  }
}
Цитата:
Сообщение от __etc Посмотреть сообщение
Это недостаток instanceof, в силу кривой реализации классов в AS1/AS2.
я прошу прощения, я не до конца обьяснил суть проблемы. Тут дело не в том что instanceof работает неправильно, а
дело в том что раньше SimpleClass работал и наследовался от ClassAsParent нормально. Тоесть методы ClassAsParent работали в SimpleClass, но в какой-то момент SimpleClass перестал наследоваться.
Если вы грешите на instanceof. то такой код
Код AS1/AS2:
  public function SimpleClass()
  {
    trace(this instanceof ClassAsParent);
    trace(this.__proto__ == ClassAsParent);
  }
выдаёт два раза False.
я уже вторые сутки пытаюсь понять что именно привело к такому результату и как это исправить. неужели никто не сталкивался с такой проблемой?

з.ы. компилирую в flash cs4. попробовал mtasc (версии 1.14) - результат такой же.

Добавлено через 6 минут
Цитата:
Сообщение от dimarik Посмотреть сообщение
А на каком этапе наследования инстансоф становится якобы не ребенком суперкласса?
компилируется без ошибок. при запуске swf у класса не работают методы парента

Старый 11.02.2009, 14:19
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 6  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Возможно дело в этом:

Цитата:
Сообщение от святой хелп адоба
Returns
Boolean - If object is an instance of or a subclass of classConstructor, instanceof returns true, otherwise it returns false. Also, _global instanceof Object returns false.
Я тут где-то писал, как возможно(!) на самом деле создаются классы компилятором из-под AS2. И Гурский что-то об этом писал. Там как раз классы - т.е. обычные функции - заносяться в _global.

add:

А вообще попробуйте вместо

Код:
trace(this instanceof ClassAsParent);
проверить реального родителя:

Код:
trace(this.prototype.__proto__ == ClassAsParent.prototype)
Если уж это покажет false, значит вы запутались в путях классов и ClassAsParent просто не является родителем класса SimpleClass.


Последний раз редактировалось chingachgoog; 11.02.2009 в 14:39.
Старый 11.02.2009, 14:32
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 7  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
не удалось воспроизвести: упорно пишет что (this instanceof ClassAsParent) - true и методы родителя вызывает..
нужен живой пример трабла

Старый 11.02.2009, 16:10
camelot вне форума Посмотреть профиль Отправить личное сообщение для camelot Найти все сообщения от camelot
  № 8  
Ответить с цитированием
camelot

Регистрация: Jul 2006
Сообщений: 26
после запарок с классом 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:
dynamic class obj.action.ActionBasic
{
   ....
	private var _distMax:Number = Lib.grid_radius;
   ....
}
вот часть Lib
Код AS1/AS2:
class Lib
{
   ....
	static var grid_radius:Number = 6;
   ....
}
делаю
Код AS1/AS2:
//private var _distMax:Number = Lib.grid_radius;
наследование востанавливается
есть у кого-нибудь почему так происходит?

Старый 11.02.2009, 17:17
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 9  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
дал бы минимальный пример, который косит
каким боком здесь ActionBasic ?
а если инициализацию _distMax перенести в конструктор тоже косит?


Последний раз редактировалось silin; 11.02.2009 в 17:21.
Старый 11.02.2009, 17:47
crazyone вне форума Посмотреть профиль Отправить личное сообщение для crazyone Найти все сообщения от crazyone
  № 10  
Ответить с цитированием
crazyone
 
Аватар для crazyone

блогер
Регистрация: Nov 2007
Адрес: Киев
Сообщений: 557
Записей в блоге: 2
Действительно, без минимального примера, который косит, врятли тут кто-то чем-то поможет.

Создать новую тему Ответ Часовой пояс GMT +4, время: 03:00.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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