2009-11-17 73 views
0

选择一个动态类我有这样一行代码:在ActionScript 3

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

我想选择这个对象将属于随机在运行时的类。有没有办法在ActionScript 3中做到这一点?

回答

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),随机()从稀薄的空气中拉出。

+0

这实际上几乎可行!我所要做的就是在'new'后删除下划线。谢谢! – 2009-11-17 05:04:11

+0

如果你想让它工作,在你从稀薄空气中拉出的东西前加上'Math.'。 – Amarghosh 2009-11-17 05:08:16

+0

Math.random返回范围[0,1)中的浮点数。你会想这样: function getRandomInt(min,max){ return Math.floor(Math.random()*(max-min + 1))+ min; } – 2009-11-17 05:28:38

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

这正是我打算做的......但我不想写一个长开关/ if语句,就像“if(randomnumber == 1){do this} else else ... “。对不起,这部分不清楚。但是,使用面向对象这是绝对要采取的方法。 – 2009-11-17 05:09:52

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; 
0

我建议如下,如果你有几类:1类,等级2,Class3中谁也都可以扩展AbstractItem

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

如果你这样做,你需要确保这些类在你的代码中的其他地方使用,如果你不是他们不会被编译进去。 – grapefrukt 2009-11-17 15:47:52

+0

是真的,你可以很容易地解决这个问题,通过制作相应的变量来确保类被编译: var item:Class1; var item:Class2; var item:Class3; – 2009-11-18 09:28:05

0

这是just somebody的答案是什么样子采用适当的AS3语法。

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

如果这些类没有共同的超类,那么可以将myObj保持为无类型。