繁体   English   中英

Flex / AS3动态创建类

[英]Flex/AS3 Dynamically Create class

我需要创建这样的想法。

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

您没有提供太多信息,所以我不知道您是否真的要这样做,但是有一些很好的理由,您可以使用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];

在不了解情况背后的原因的情况下,最有可能需要的是接口。 首先创建一个接口(请参阅此处的示例):

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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM