選擇一個動態類我有這樣一行代碼:在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