AS3:将变量转换为动态类型

时间:2010-11-01 00:45:19

标签: actionscript-3 flex4

是否可以动态地将变量转换为类型,其中类型是Class类型的变量?

考虑以下(无效):

var myClass:Class = MyClass;
var myInstance:myClass = new myClass();

对于上下文:我正在使用Flex(4)创建一个模态管理器,它将控制创建模态的各个方面(通过PopUpManager),并且我希望尽可能保持最小化。组件将通过相同的函数传递,而不是允许转换任何类型的变量,例如:

var myInstance:* = new myClass();

我宁愿尽可能明确地保持它。授予AFAIK这样做没有实际优势,因为在分配之前需要检查以确保参数类型为Class - 它更像是POC而不是任何东西。

欢迎任何想法。

编辑:我想我可以做到以下几点:

var myClass:Class = MyClass;
var myInstance:* = new myClass() as myClass;

但我不确定这是否是最佳方式。

3 个答案:

答案 0 :(得分:3)

我不知道这与您遇到的问题是否相同。我需要一个有孩子实现接口的类。实现类可以是任何类型,但我需要保存并加载所有信息。

假设我有以下内容:

public interface WindowChild {...}

public class Window {
    public var child:WindowChild;
}

当保存窗口时,我将所有内容保存在XML blob中。我在Flash播放器中找到了一个功能:
flash.utils.getQualifiedClassName(value:*):String
文档说:“返回对象的完全限定类名。”这意味着它返回的String将类似于your.packages::ClassName。当Window班级拨打电话getQualifiedClassName(child)时,它会变成my.packages.structure::MyImplementation
请注意,这不是接口WindowChild的路径,而是我创建的实现该接口的类。

当再次加载所有信息时,我使用了另一个Flash函数getQualifiedClassName(child)。此函数“返回对name参数指定的类的类对象的引用。”我认为这只是一种奇特的方式,它会返回Object但它的类型为Class

我需要做的就是:

var childClass:Class = getDefinitionByName(childClassName) as Class; //Child class name is what was returned from getQualifiedClassName(child)
child = new childClass(); // This creates a new Object of what ever type childClass is

此方法将保留运行时类型检查,但您始终可以添加另一个中间步骤,以确保从new childClass()返回的内容是您想要的。

希望这很有用。

干杯

答案 1 :(得分:2)

我认为编译器不能处理动态类型。如果可以的话,可以实现类似于Generics的功能。

我认为你能做的最好的事情是:

var myClass:Class = MyClass;
var myObject:* = new myClass();

答案 2 :(得分:0)

我不这么认为。当我希望传递多种类型时,我会做这样的事情:

public function doSomethingWithThis(something:Object):void {
    var button:Button = something as Button;
    var image:Image = something as Image;
    var list:List = something as List;


    if (button) {


    }
    else if (image) {


    }
    else if (list) {


    }
    else {
        throw new Error("This type of object will not work with this method.");
    }


}