Можно ли объявлять векторы AS3 с помощью ссылки на тип? - PullRequest
4 голосов
/ 05 июня 2009

Вместо этого:

var v:Vector.<String> = new Vector.<String>();

есть ли способ сделать что-то подобное?

var myType:Class = String;
var v:Vector.<myType> = new Vector.<myType>();

Очевидно, что это не работает, как написано, но, надеюсь, вы поняли идею.

Ответы [ 3 ]

4 голосов
/ 05 июня 2009

Краткий ответ - попробуйте ответ грейпфрута и посмотрите.

Однако я не думаю, что это возможно на уровне байт-кода. Проблема связана с тем, как строятся дженерики (векторы). В основном байт-код для создания экземпляра Vector <>:

GenericDefinitionType (Vector) + GenericParameter (int) -> GenericType
Coerce (cast) GenericType as KnownGenericType (eg. "Vector.<int>")

Таким образом, проблема не в создании, поскольку GenericParameter является просто многоименным (который может быть динамическим). Проблема заключается в приведении к известному векторному типу (например, фактически зарегистрированному как «Вектор. »), поскольку нет известного векторного типа.

См. Мой пост на , как Векторы работают в байт-коде , для подробностей.

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

Я нашел способ динамического создания Векторов. Вместо того, чтобы передавать тип как класс, вы передаете весь вектор как класс, например:

public function createVector (vectorType:Object):Object
{
    return new vectorType();
}

var v:Vector.<String> = createVector(Vector.<String>);

Или вы можете скопировать вектор следующим образом:

public function getCopy (ofVector:Object):Object
{
    var copy:Object = new ofVector.constructor;

    return copy;
}
0 голосов
/ 05 июня 2009

Это не проверено, но я не понимаю, почему это не должно работать:

import flash.display.Sprite;
import flash.utils.getDefinitionByName;

var ClassReference:Class = getDefinitionByName("flash.display.Sprite") as Class;
var v:Vector.<ClassReference> = new Vector.<ClassReference>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...