[英]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"
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.