Показать сообщение отдельно
Старый 21.12.2010, 19:16
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 1  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Attention Чудеса автогенеренных классов во Flash CS4/CS5.

Может кто сталкивался, даже не знаю, можно ли как то с этим бороться... Кроме как отказаться от автогенеренных классов...

Суть проблемы такая.
У нас есть наш простой класс:

Код AS3:
package  
{
	import flash.display.MovieClip;
	public class BaseMyGroup extends MovieClip
	{
 
		public function MyGroup() 
		{
 
		}
 
	}
 
}

Создаем во Flash символ со следующими свойствами:
Export for Action Script – включаем
Class: MyGroup
Base Class: BaseMyGroup

Внутри ложем какой ни будь другой символ с именем. Например Символ Element, с именем “_element”. Путь Element будет компонентом, в котором мы через ComponentDefinition добавили свойство «varName».
Компилируем. Затем декомпилируем чем нибудь вроде Flash Decompiler Trillix, и смотрим что получилось:
Код AS3:
//ActionScript 3.0
//  class BaseMyGroup
package 
{
    import flash.display.*;
 
    public class BaseMyGroup extends flash.display.MovieClip
    {
        public function BaseMyGroup()
        {
            super();
            return;
        }
 
        public var _element:Element;
    }
}
 
 
//  class Element
package 
{
    import flash.display.*;
 
    public dynamic class Element extends flash.display.MovieClip
    {
        public function Element()
        {
            super();
            return;
        }
    }
}
 
 
//  class MyGroup
package 
{
    import adobe.utils.*;
    import flash.accessibility.*;
    import flash.desktop.*;
    import flash.display.*;
    import flash.errors.*;
    import flash.events.*;
    import flash.external.*;
    import flash.filters.*;
    import flash.geom.*;
    import flash.globalization.*;
    import flash.media.*;
    import flash.net.*;
    import flash.net.drm.*;
    import flash.printing.*;
    import flash.profiler.*;
    import flash.sampler.*;
    import flash.sensors.*;
    import flash.system.*;
    import flash.text.*;
    import flash.text.engine.*;
    import flash.text.ime.*;
    import flash.ui.*;
    import flash.utils.*;
    import flash.xml.*;
 
    public dynamic class MyGroup extends BaseMyGroup
    {
        public function MyGroup()
        {
            super();
            this.__setProp__element_MyGroup_Layer1_0();
            return;
        }
 
        function __setProp__element_MyGroup_Layer1_0():*
        {
            var loc1:*;
            try
            {
                _element["componentInspectorSetting"] = true;
            }
            catch (e:Error)
            {
            };
            _element.varName = "test";
            try
            {
                _element["componentInspectorSetting"] = false;
            }
            catch (e:Error)
            {
            };
            return;
        }
    }
}
И результат шокирует. Flash вместо того, что бы добавить переменную
Код AS3:
        public var _element:Element;
в класс MyGroup, добавляет ее в базовый класс BaseMyGroup.
При работе в одной флэшке это конечно не сильно заментно, разве что неприятно, что если у нас много символов наследников BaseMyGroup, то в конечном счете в нем будет очень много переменных. Так как если сделать MyGroup2, с экземпляром внутри _element2, в классе BaseMyGroup после декмпиляции будет уже 2 переменные:
Код AS3:
        public var _element:Element;
        public var _element2:Element;
А если мы компонуем на том же FlashDevelop проект в котором подключено несколько swc в каждом из которых присутвуют наследники BaseMyGroup, то столкнемся с тем, что что-то перестанет работать. Так как в результирующем проекте будет только один экземпляр BaseMyGroup выбранный из одной из подключенных swc, а то и вовсе оригинальный, в котором нет вообще переменных. И тогда приложение будет падать в конструкторе, в строчках подобных этой:
Код AS3:
            _element.varName = "test";
С ошибкой, что переменная «_element» не оепределенна, ведь она действительно не определенна...

Глюк проверен в Flash cs3 и Flash c4. Кто нибудь сталкивался с этим? Есть ли какой нибудь способ адекватно с этим бороться, не делая для каждого символа реальный класс, вроде:

Код AS3:
package  {
 
	import flash.display.MovieClip;
 
 
	public class MyGroup extends BaseMyGroup {
 
 
		public function MyGroup() {
			// constructor code
		}
	}
 
}
?

Искренне Ваш, Джек.