2009-11-17 104 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保持爲無類型。