Flash 在Actionscript 3中动态选择类

Flash 在Actionscript 3中动态选择类,flash,actionscript-3,class,Flash,Actionscript 3,Class,我有一行这样的代码: var myObj:[SomeClass] = new [SomeClass](); 我想在运行时随机选择这个对象属于哪个类。在ActionScript3中有这样做的方法吗?我不知道这在AS3中会有多好,但在JS中,我会使用 var classes = [foo, bar, baz]; var myObj = new_(classes[random() % 3])(); 也许它也能在AS3中工作 new.是Zeta()的一部分,random()是从稀薄的空气中提取出来的

我有一行这样的代码:

var myObj:[SomeClass] = new [SomeClass]();

我想在运行时随机选择这个对象属于哪个类。在ActionScript3中有这样做的方法吗?

我不知道这在AS3中会有多好,但在JS中,我会使用

var classes = [foo, bar, baz];
var myObj = new_(classes[random() % 3])();
也许它也能在AS3中工作


new.
是Zeta()的一部分,random()是从稀薄的空气中提取出来的。

我认为没有任何直接的方法可以做到这一点。但是你可以试试这个

var funcArray:Array = new Array();

public function getObjClass1():Class1 {
  return new Class1();
}
...
...
public function getObjClassN():ClassN {
  return new ClassN();
}
//add all functions to funcArray array
public function addFunctions():void {
  funcArray.push(getObjClass1);
  ...
  funcArray.push(getObjClassN);
}

public function getRandomObject():* {
  return funcArray\[Math.floor(Math.Random() * funcArray.length)\]();
}

下面是面向对象编程:

将变量的类型声明为通用超类的类型(或接口),并从该超类(或接口)扩展(或实现)所有可能的类

以下是使用接口的示例:

public interface MyType
{
}
public class Type1 implements MyType
{
}
public class Type2 implements MyType
{
}
public class Type3 implements MyType
{
}

我认为你应该能够做如下事情:

var classes:Array = [Class1, Class2, Class3];
var obj:Obj = new classes[0];
var classes:Array = [Class1, Class2, Class3];
var obj:IInterface = (new classes[0]) as IInterface;
每个类可能都必须实现一个共享接口以使其有用。所以它看起来像:

var classes:Array = [Class1, Class2, Class3];
var obj:Obj = new classes[0];
var classes:Array = [Class1, Class2, Class3];
var obj:IInterface = (new classes[0]) as IInterface;

如果你有几个类,我建议如下:Class1、Class2、Class3,它们都扩展了AbstractItem

var itemClass:Class = getDefinitionByName("com.packagename.Class" + Math.floor(Math.random()*3 +1)) as Class;
var item:AbstractItem = new itemClass();
这就是正确的AS3语法中的答案

var classes:Array = [Foo, Bar, Baz];
var myObj:YourSuperclass = new classes[int(Math.random() * classes.length)];

如果类没有公共超类,则可以保持myObj的非类型化

这实际上几乎奏效了!我所要做的就是删除“new”后面的下划线。谢谢添加
Math.
在你从稀薄空气中取出的东西前面,如果你想让它工作的话。Math.random returns从[0,1]范围内浮动。你想要这样的东西:函数getRandomInt(min,max){return Math.floor(Math.random()*(max-min+1))+min;}这正是我计划要做的…但我不想写一个长的switch/if语句,就像“if(randomnumber==1){dothis}else if…”。抱歉,这部分不清楚。但是,是的,使用OO这绝对是应该采取的方法。如果您这样做,您需要确保这些类在代码中的其他地方使用,如果您不这样做,它们将不会被编译。确实,您可以通过生成相应的变量来轻松修复这一问题,以确保这些类被编译:var item:Class1;var item:Class2;var项目:类别3;