我有一行代码如下:
var myObj:[SomeClass] = new [SomeClass]();
我想在运行时随机选择该对象属于哪个类。有没有办法在Actionscript 3中执行此操作?
答案 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无类型。