Динамически создать типизированный Vector из аргумента функции? - PullRequest
5 голосов
/ 01 апреля 2011

Для игры, которую я пытаюсь разработать, я пишу класс пула ресурсов, чтобы перерабатывать объекты без вызова оператора «new». Я хотел бы иметь возможность указать размер пула, и я бы хотел, чтобы он был строго напечатан.

Из-за этих соображений я думаю, что Вектор был бы моим лучшим выбором. Однако, поскольку Vector является последним классом, я не могу его расширить. Итак, я решил использовать композицию вместо наследования, в данном случае.

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

Вот что я попробовал:

public final class ObjPool
{
    private var objects:Vector.<*>;

    public function ObjPool(poolsize:uint, type:Class)
    {
        objects = new Vector.<type>(poolsize);  // line 15
    }
}

А вот ошибка, которую я получаю от FlashDevelop при попытке собрать:

\ src \ ObjPool.as (15): col: 18 Ошибка: доступ к неопределенному типу свойства.

Кто-нибудь знает способ сделать это? Похоже, что компилятор Flash не любит принимать имена переменных в нотации скобок Vector. (Я попытался изменить параметр конструктора "type" на String в качестве теста, но безрезультатно; я также попытался поместить туда getQualifiedClassName, но это тоже не сработало. Нетипизирование объектов var также оказалось бесплодным.) я даже не уверен, является ли тип "Class" правильным способом - кто-нибудь знает?

Спасибо!

Редактировать: Для пояснения я звоню своему классу так:

var i:ObjPool = new ObjPool(5000, int);

Целью является указать размер и тип.

Двойное редактирование: Для тех, кто наткнулся на этот вопрос в поисках ответа, изучите Обобщения в языке программирования Java . На момент написания этой статьи они не реализованы в ActionScript 3. Удачи.

Ответы [ 5 ]

2 голосов
/ 15 июля 2011

Я пытался сделать это некоторое время, и пост Доминика Танкреди заставил меня думать, что даже если вы не можете пойти:

objects = new Vector.<classType>(poolsize);

Вы могли бы пойти что-то вроде:

public final class ObjPool
{
    private var objects:Vector.<*>;

    public function ObjPool(poolsize:uint, type:Class)
    {
        var className   : String = getQualifiedClassName(type);
        var vectorClass : Class  = Class(getDefinitionByName("Vector.<" + className + ">"));
        objects = new vectorClass(poolsize);
    }
}

Я пробовал его как с int, так и с пользовательским классом, и, похоже, он работает нормально. Конечно, вам придется проверить, действительно ли вы получаете какую-либо скорость от этого, поскольку объекты - это Вектор. <*> И flash может выполнять некоторые неявные проверки типов, которые сводят на нет скорость, которую вы получаете от использования вектора.

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

2 голосов
/ 01 апреля 2011

Это интересный вопрос (+1!), В основном потому, что я никогда не пробовал его раньше. Кажется, из вашего примера это невозможно, что я нахожу странным, возможно, что-то связанное с тем, как работает компилятор. Я спрашиваю, почему вы хотели бы сделать это, хотя. Преимущество Vector в сравнении с массивом в основном связано с его типизацией, однако вы явно объявляете его тип неопределенным, что означает, что вы потеряли прирост производительности. Так почему бы не использовать вместо этого массив? Просто пища для хотя.

EDIT

Я могу подтвердить, что это невозможно, это открытая ошибка. Смотрите здесь: http://bugs.adobe.com/jira/browse/ASC-3748 Извините за новости!

Тайлер.

2 голосов
/ 01 апреля 2011

Хорошо, что вы пытаетесь держаться подальше от нового, но:

Все, что я когда-либо читал о Vector <> в ActionScript, говорит, что оно должно быть строго напечатано Так это не должно работать.

Редактировать: я говорю, что это не может быть сделано. Вот посмотрите, поможет ли это.

Можно ли определить универсальный тип Vector в Actionsctipt 3?

0 голосов
/ 24 апреля 2013

Я не вижу смысла в использовании вектора. <*>. Можно и с Array.

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

public function getCopy (ofVector:Object):Object
{
    var copy:Object = new ofVector.constructor;
   // Do whatever you like with the vector as long as you don't need to know the type

    return copy;
}
0 голосов
/ 01 апреля 2011

Снято в доке, но попробуйте это:

var classType:Class = getDefinitionByName(type) as Class;
...
objects = new Vector.<classType>(poolsize);  // line 15

падает микрофон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...