我需要像这样创造一些思考。
var s:String;
var b1:Boolean;
if (b1==true)
s="Class1()"
else
s="Class2()";
var o:Object;
o = new [s]() // create or new Class1(), or new Class2
答案 0 :(得分:1)
您还没有提供太多信息,所以我不知道您是否真的需要这样做,但有一些很好的理由可以做到,而且可以做到使用getDefinitionByName
:
var className:String = somethingIsTrue ? "Class1" : "Class2";
var classType:Class = getDefinitionByName(className) as Class;
if (classType)
trace(new classType());
请注意:
"path.to.my.stuff.Class1"
getDefinitionByName
将无法找到它。解决此问题的最简单方法是在某处放置类型声明,例如var a:Class1, b:Class2
。另一种方法是将这些类放在swc
库中。getDefinitionByName
非常慢(感谢@Philarmon),所以要明确:除非你真的必须这样做,否则请避免这种情况。 编辑:以下是如果不使用使用字符串的示例:
var classType:Class = somethingIsTrue ? Class1 : Class2;
var instance:Object = new classType();
正如您所看到的,如果您事先确实知道了班级名称,则不必使用字符串。实际上,您提前知道课程名称的情况很少见。
即使您是以字符串开头(例如来自JSON序列化用户数据),只要您提前知道类名,就可以将字符串映射到类引用:
var classes:Object = {
"alfa": Class1,
"bravo": Class2
}
var className:String = "alfa";
var instance:Object = new classes[key];
答案 1 :(得分:0)
在不知道你的情况背后的原因的情况下,你很可能正在寻找的是一个界面。首先创建一个接口(例如,参见here):
public interface MyInterface {
//Include any methods the classes should implement here
}
然后每个类都应该实现该接口:
public class Class1 implements MyInterface
最后,在创建它们时,您可以这样做:
var o:MyInterface;
if (b1 == true)
o = new Class1();
else
o = new Class2();