Flex cookbook entry: How to dynamically create instance of Vector class.
В десятой версии Flash Player’а появилось много нового и я сегодня немного эксперементировал с одним из «новых» классов — __AS3__.vec.Vector. Этот класс пришёл к нам, как скоростной аналог типизированного массива. Я не делал скоростных замеров, т.к. таковых в сети хватает. Я попробовал создать экземпляр класса Vector динамически, т.е. без прямого указания типа его элементов.
Итак, экземпляры класса Vector создаются так
var vector:Vector.<Sprite> = new Vector.<Sprite>();
Если подставить, вместо явного указания типа элементов, переменную
var itemType:Class = Sprite; var vector:Vector.<*> = new Vector.<itemType>();
то Flex Builder 3 тут же сообщит
1046: Type was not found or was not a compile-time constant: Vector.
Я опробовал разные методы подстановки, но ничего не получилось. Но нашёл другой путь и тут же расширил класс aw.utils.ClassUtils(упоминался ранее).
Вот, два метода, добавленые специально для работы с типом Vector:
static public const VECTOR_CLASS_NAME:String = getQualifiedClassName(Vector); static public function getVectorDefinition(itemDefinition:Class, applicationDomain:ApplicationDomain=null):Class{ if(!applicationDomain) applicationDomain = ApplicationDomain.currentDomain; return applicationDomain.getDefinition(VECTOR_CLASS_NAME+'.<'+getQualifiedClassName(itemDefinition)+'>') as Class; } static public function createCustomVector(itemDefinition:Class, length:uint=0, fixed:Boolean=false, applicationDomain:ApplicationDomain=null):Vector.<*>{ var definition:Class = getVectorDefinition(itemDefinition, applicationDomain); return new definition(length, fixed); }
С помощью этих методов можно получит ссылку на объект необходимого класса
var itemType:Class = Sprite; var definition:Class = ClassUtils.getVectorDefinition(itemType); trace(definition); // [class Vector.<flash.display::Sprite>] trace(getQualifiedClassName(definition)); // __AS3__.vec::Vector.<flash.display::Sprite>
или создать экземпляр класса Vector c необходимым типом элементов
var itemType:Class = Sprite; var vector:Vector.<*> = ClassUtils.createCustomVector(itemType); trace(getQualifiedClassName(vector)); // __AS3__.vec::Vector.<flash.display::Sprite> vector.push(new Sprite()); vector.push(new MovieClip()); try{ vector.push(new Object()); }catch(error:Error){ trace(error.message); // Error #1034: Type Coercion failed: cannot convert Object@6e3c269 to flash.display.Sprite. }
Единственное "но" в том, что этот приём работает только с общедоступными, public классами.
Загрузить пример.
Метки: ActionScript 3, ClassUtils, FP10, getDefinitionByName, Vector
Позновательно – в мемориз
Спасибо. Интересно. В мемориз