Можно ли получить тип неинициализированной переменной в Action Script 3? - PullRequest
1 голос
/ 12 января 2011

Задача была довольно простой: мне нужно было динамически инициализировать переменную с ключевым словом new , в зависимости от его типа. Например:

public var object:Sprite;

...

object = new Sprite();

В этом случае типом является Sprite , но это может быть что угодно, и метод, который фактически создает его с помощью new , не знает, с каким типом он был объявлен. Конечно, я мог сохранить тип (или имя класса) в строковой переменной и создать экземпляр объекта с ним. Но мне просто интересно, смогу ли я получить эту информацию о типе от самого объекта, потому что он объявлен в классе и логически думает, что его информация о типе может где-то храниться и быть извлекаемой.

Ответы [ 3 ]

4 голосов
/ 12 января 2011

Да, вы можете, но переменная должна быть общедоступной (или иметь методы доступа), и вам нужно ее имя в виде строки:

Используйте descriptionType () , чтобы получить XML-описание вашего класса, затем получите методы доступа и переменные в виде XMLList, выполняйте итерации до тех пор, пока не найдете имя своей переменной, и получите класс, вызвав getDefinitionByName () . Вот пример:

var className : String = "";
var type:XML = describeType (this);
var variables:XMLList = type..variable;
for each (var variable:XML in variables) {
    if (variable.@name == myVariableName) {
        className = variable.@type;
        break;
    }
}
if (className == "") {
    var accessors:XMLList = type..accessor;
    for each (var accessor:XML in accessors) {
        if (accessor.@name == myVariableName) {
            className = accessor.@type;
            break;
        }
    }
}
if (className=="") {
    trace ("no such variable");
    return;
}
var ClassReference : Class = getDefinitionByName( className.replace ("::", ".") ) as Class;
myVariable = new ClassReference( );
0 голосов
/ 05 января 2012

Я не могу понять, как "ответить" на ответ, иначе я бы добавил это к текущему верхнему ответу.

Если у вас есть список известных типов, которыми может быть объект, выможет проверять эти типы, используя typeof .

switch(typeof unknownVar)
{
   case typeof Function:
       unknownVar = new Function();
       break;
   case typeof String:
       unknownVar = "Bruce Lee";
       break;
   case typeof Number:
       unknownVar = 3.14;
       break;
   default:
       trace(typeof unknownVar);  // This is not normally helpful...
}
0 голосов
/ 12 января 2011

Короче говоря, нет, вы не можете получить тип неинициализированной переменной.

Похоже, что это своего рода реализация фабричного шаблона.Лучше всего передать ссылку класса на метод

метод:

public function create(class:Class) : void
{
   return new class();
}

код вызова:

public var object:Sprite;

...

object = createObject(Sprite)
...