Динамическое создание экземпляров класса Vector

Flex cookbook entry: How to dynamically create instance of Vector class.

В десятой версии Flash Player’а появилось много нового и я сегодня немного эксперементировал с одним из «новых» классов — __AS3__.vec.Vector. Этот класс пришёл к нам, как скоростной аналог типизированного массива. Я не делал скоростных замеров, т.к. таковых в сети хватает. Я попробовал создать экземпляр класса Vector динамически, т.е. без прямого указания типа его элементов.

Итак, экземпляры класса Vector создаются так

  1. var vector:Vector.<Sprite> = new Vector.<Sprite>();

Если подставить, вместо явного указания типа элементов, переменную

  1. var itemType:Class = Sprite;
  2. 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:

  1. static public const VECTOR_CLASS_NAME:String = getQualifiedClassName(Vector);
  2. static public function getVectorDefinition(itemDefinition:Class, applicationDomain:ApplicationDomain=null):Class{
  3. if(!applicationDomain) applicationDomain = ApplicationDomain.currentDomain;
  4. return applicationDomain.getDefinition(VECTOR_CLASS_NAME+'.<'+getQualifiedClassName(itemDefinition)+'>') as Class;
  5. }
  6. static public function createCustomVector(itemDefinition:Class, length:uint=0, fixed:Boolean=false, applicationDomain:ApplicationDomain=null):Vector.<*>{
  7. var definition:Class = getVectorDefinition(itemDefinition, applicationDomain);
  8. return new definition(length, fixed);
  9. }

С помощью этих методов можно получит ссылку на объект необходимого класса

  1. var itemType:Class = Sprite;
  2. var definition:Class = ClassUtils.getVectorDefinition(itemType);
  3. trace(definition); // [class Vector.<flash.display::Sprite>]
  4. trace(getQualifiedClassName(definition)); // __AS3__.vec::Vector.<flash.display::Sprite>

или создать экземпляр класса Vector c необходимым типом элементов

  1. var itemType:Class = Sprite;
  2. var vector:Vector.<*> = ClassUtils.createCustomVector(itemType);
  3. trace(getQualifiedClassName(vector)); // __AS3__.vec::Vector.<flash.display::Sprite>
  4. vector.push(new Sprite());
  5. vector.push(new MovieClip());
  6. try{
  7. vector.push(new Object());
  8. }catch(error:Error){
  9. trace(error.message); // Error #1034: Type Coercion failed: cannot convert Object@6e3c269 to flash.display.Sprite.
  10. }

Единственное "но" в том, что этот приём работает только с общедоступными, public классами.
Загрузить пример.

Метки: , , , ,

Комментарии (2) на «Динамическое создание экземпляров класса Vector»

  1. shaman4d:

    Позновательно – в мемориз

  2. Спасибо. Интересно. В мемориз :)

Добавить комментарий

Вы должны авторизоваться для отправки комментария.