选择一个动态类我有这样一行代码:在ActionScript 3
var myObj:[SomeClass] = new [SomeClass]();
我想选择这个对象将属于随机在运行时的类。有没有办法在ActionScript 3中做到这一点?
选择一个动态类我有这样一行代码:在ActionScript 3
var myObj:[SomeClass] = new [SomeClass]();
我想选择这个对象将属于随机在运行时的类。有没有办法在ActionScript 3中做到这一点?
我不知道该怎么好,这将在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),随机()从稀薄的空气中拉出。
我不认为有任何直接的方法来做到这一点。但你可以试试这个东西。
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 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
{
}
这正是我打算做的......但我不想写一个长开关/ if语句,就像“if(randomnumber == 1){do this} else else ... “。对不起,这部分不清楚。但是,使用面向对象这是绝对要采取的方法。 – 2009-11-17 05:09:52
我想你应该能够做这样的事情:
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;
我建议如下,如果你有几类:1类,等级2,Class3中谁也都可以扩展AbstractItem
var itemClass:Class = getDefinitionByName("com.packagename.Class" + Math.floor(Math.random()*3 +1)) as Class;
var item:AbstractItem = new itemClass();
如果你这样做,你需要确保这些类在你的代码中的其他地方使用,如果你不是他们不会被编译进去。 – grapefrukt 2009-11-17 15:47:52
是真的,你可以很容易地解决这个问题,通过制作相应的变量来确保类被编译: var item:Class1; var item:Class2; var item:Class3; – 2009-11-18 09:28:05
这是just somebody的答案是什么样子采用适当的AS3语法。
var classes:Array = [Foo, Bar, Baz];
var myObj:YourSuperclass = new classes[int(Math.random() * classes.length)];
如果这些类没有共同的超类,那么可以将myObj保持为无类型。
这实际上几乎可行!我所要做的就是在'new'后删除下划线。谢谢! – 2009-11-17 05:04:11
如果你想让它工作,在你从稀薄空气中拉出的东西前加上'Math.'。 – Amarghosh 2009-11-17 05:08:16
Math.random返回范围[0,1)中的浮点数。你会想这样: function getRandomInt(min,max){ return Math.floor(Math.random()*(max-min + 1))+ min; } – 2009-11-17 05:28:38