Flex / AS3动态创建类

时间:2016-03-07 14:02:43

标签: actionscript-3 flex

我需要像这样创造一些思考。

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

2 个答案:

答案 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"
  • 如果没有"真实"对代码中的类的引用(类名称的字符串不会被计数)它将不会被编译到您的SWF中,因此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();