2011-01-12 2 views
1

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

public var object:Sprite; 

... 

object = new Sprite(); 

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

ответ

4

Да, вы можете, но переменная должна быть публичной (или имеют вспомогательные методы), и вам нужно, чтобы его имя называлось String:

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

var className : String = ""; 
var type:XML = describeType (this); 
var variables:XMLList = type..variable; 
for each (var variable:XML in variables) { 
    if ([email protected] == myVariableName) { 
     className = [email protected]; 
     break; 
    } 
} 
if (className == "") { 
    var accessors:XMLList = type..accessor; 
    for each (var accessor:XML in accessors) { 
     if ([email protected] == myVariableName) { 
      className = [email protected]; 
      break; 
     } 
    } 
} 
if (className=="") { 
    trace ("no such variable"); 
    return; 
} 
var ClassReference : Class = getDefinitionByName(className.replace ("::", ".")) as Class; 
myVariable = new ClassReference(); 
+0

Удивительный. Благодарю. – jayarjo

+0

Кстати, есть ли какая-либо информация о том, насколько велика оценка эффективности для этого? – jayarjo

+2

Да, это, к сожалению, существенно. Вы можете повысить производительность, сохранив хеш-таблицу с аксессуарами и переменными типов, которые вы уже описали один раз, так что вам придется выполнять итерации XMLList со второго раза. – weltraumpirat

-1

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

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

метод:

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

код вызова:

public var object:Sprite; 

... 

object = createObject(Sprite) 
+0

Вы ошибаетесь, и ваш метод создания не решает проблему - вам все равно понадобится тип класса для создания экземпляра. – weltraumpirat

+0

@weltraumpirat - Яркий крик об отражении, хотя он, вероятно, немного длинный, учитывая возможности ограниченного отражения ActionScript. Мой ответ - это скорее другой подход, учитывая, что у него есть метод, который создает объект различного типа. –

+0

Да, это так, но вы передаете тип класса в качестве аргумента. Вопрос заключался в том, как создать экземпляр переменной, если вы не знаете тип, поэтому ваше решение действительно не решает проблему вообще. – weltraumpirat

0

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

Если у вас есть список известных типов, которыми мог бы быть объект, вы можете протестировать их против этих типов, используя 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... 
} 
Смежные вопросы