Как я могу динамически создавать векторы в AS3? - PullRequest
3 голосов
/ 29 декабря 2011

Я хочу создать класс, который будет в основном содержать Vector.У класса будут некоторые методы, которые работают с элементами в векторе.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу понять, как динамически создавать экземпляр Vector.Пока что я пробовал это и подобное без удачи:

public class List
{
    private var _content:Vector;

    public function List(type:Class)
    {
        _content = new Vector.<type>();
    }
}

Ответы [ 5 ]

6 голосов
/ 14 января 2012

Вот как я динамически создаю вектор BitmapData (который требуется классом MouseCursorData):

var vectorClassOfBitmapData:Class = Class(getDefinitionByName("__AS3__.vec::Vector.<flash.display::BitmapData>"));

var bitmapDataVector:* = new vectorClassOfBitmapData(1,true);

Выше указано то же, что и во время компиляции:

var bitmapDataVector:* = new Vector.<BitmapData>(1, true);

Таким образом, вы можете составить строку определения класса во время выполнения и использовать getDefinitionByName для динамического конструирования векторов разных типов данных.

Не совсем то, что вы искали, но это может помочь другим.

5 голосов
/ 29 декабря 2011

Этот пост Пола Робертсона (ранее старший разработчик / писатель ActionScript в Adobe) предоставляет немного больше информации о том, как объявляются векторы:

Класс Vector разрешает (требует) вы должны указать тип, который он будет содержать во время компиляции - как для объявлений переменных, так и при создании экземпляров.

Поскольку параметр типа является литералом, он должен быть предоставлен во время компиляции.Фактически, каждая ссылка на Vector проверяется во время компиляции, за исключением .shift() и .unshift, которые проверяются во время выполнения.

Статья Adobe об индексированных массивах предоставляет более интересную информацию об этом.Фактически, в нем упоминается, что строгая безопасность типов времени компиляции является одной из ключевых особенностей Векторов.

Вкратце: невозможно использовать переменную для установки типа вектора, поскольку параметр типа является литераломи требование времени компиляции.

Надеюсь, что поможет!

Дополнительные ссылки:

4 голосов
/ 29 декабря 2011

Другой вариант, который может работать для вас, это использовать интерфейс; Векторы не обязательно должны быть конкретными типами. Поэтому, если вы можете абстрагироваться от какого-то общего контракта, которого могут придерживаться ваши объекты, используйте его вместо этого. Например, скажем, вам нужен список объектов для визуализации, вы можете сказать:

public interface IRenderable {
    function renderTo(obj:DisplayObject):void;
}

var _content:Vector.<IRenderable> = new Vector.<IRenderable>();

Затем вы можете добавить в вектор столько разных типов бетона, сколько они поддерживают интерфейс IRenderable. Таким образом, хотя дженерики в ActionScript 3 на самом деле просто синтаксический сахар компилятора, как сказал Эндрю Одри, вы можете обойти это в зависимости от того, что вы конкретно пытаетесь сделать.

1 голос
/ 29 декабря 2011

Звучит так, будто вам нужен только массив!Производительность улучшается только с Vector <>, потому что тип сортируется во время компиляции.Если вам нужен «динамический» тип, вам следует использовать массив.

0 голосов
/ 27 марта 2014

Первоначальному вопросу пару лет, но я хотел поделиться этим, потому что это может помочь другим. Он вдохновлен ответом Мэтью Петерсона, но предполагает немного меньше о внутренних именах классов (он принимает только синтаксис. <>).

    function CreateVectorOf(subtype:Class)
    {
        var vecname:String = getQualifiedClassName(Vector);
        var subname:String = getQualifiedClassName(subtype);
        var vecclass:Class = getDefinitionByName(vecname + ".<" + subname + ">") as Class;
        return new vecclass();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...