是否可以动态地将变量转换为类型,其中类型是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;
但我不确定这是否是最佳方式。
答案 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.");
}
}