2011-01-12 54 views
1

该任务意图非常简单:我需要动态地根据它的类型初始化变量新的关键字。例如:是否可以在Action Script 3中获得未初始化变量的类型?

public var object:Sprite; 

... 

object = new Sprite(); 

在这种情况下,类型是雪碧,但它可能是任何东西,这实际上与实例化它的方法,用什么类型它被宣布不知道。当然,我可以将类型(或类名称)存储在字符串变量中,并使用它实例化对象。但我只是想知道是否可以从对象本身获取该类型信息,因为它是在类中声明的,逻辑上认为它的类型信息可能存储在某个地方并且可以被检索。

回答

4

是的,你可以,但变量必须是公共的(或有accessor方法),你需要它的名字作为一个字符串:

使用describeType()得到你的类的XML描述,然后获取访问器和变量作为XMLList,迭代直到y找到你的变量的名字,并通过调用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(); 
-1

总之,不能获得未初始化变量的类型。

这样的声音是一种工厂模式的实现。最好的办法是到类的引用传递给方法

方法:

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

调用代码:

public var object:Sprite; 

... 

object = createObject(Sprite) 
+0

你错了,你的创建方法不能解决问题 - 你仍然需要类类型来实例化。 – weltraumpirat 2011-01-12 12:12:26

+0

@weltraumpirat - 对反射的公平呼喊,尽管考虑到ActionScript有限的反射能力,它可能会有点长时间啰嗦。我的回答更多地是一种不同的方法,因为他有一个实例化不同类型对象的方法。 – 2011-01-12 12:35:23

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... 
}