在Actionscript 3中动态选择类

时间:2009-11-17 04:42:25

标签: flash actionscript-3 class

我有一行代码如下:

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

我想在运行时随机选择该对象属于哪个类。有没有办法在Actionscript 3中执行此操作?

6 个答案:

答案 0 :(得分:1)

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

var classes = [foo, bar, baz];
var myObj = new_(classes[random() % 3])();

也许它也适用于AS3?

new_是Zeta(http://codex.sigpipe.cz/zeta/docs/reference.rest#new-cls)的一部分,random()是从空气中拉出来的。

答案 1 :(得分:0)

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

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)\]();
}

答案 2 :(得分:0)

面向对象编程:

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

public class MyType
{
}
public class Type1 extends MyType
{
}
public class Type2 extends MyType
{
}
public class Type3 extends MyType
{
}

var something:MyType;
//Now you can do
something = new Type1();
something = new Type2();
something = new Type3();

以下是使用接口的示例:

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

答案 3 :(得分:0)

我认为你应该能够做到这样的事情:

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;

答案 4 :(得分:0)

如果您有几个类,我建议如下:Class1,Class2,Class3都扩展AbstractItem

var itemClass:Class = getDefinitionByName("com.packagename.Class" + Math.floor(Math.random()*3 +1)) as Class;
var item:AbstractItem = new itemClass();

答案 5 :(得分:0)

这是just somebody在正确的AS3语法中的答案。

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

如果类没有公共超类,则可以保持myObj无类型。