2009-11-17 5 views

Répondre

1

Je ne sais pas à quel point ce serait voler en AS3, mais JS, j'utiliser

var classes = [foo, bar, baz]; 
var myObj = new_(classes[random() % 3])(); 

peut-être que ça fonctionne en AS3 aussi?

new_ fait partie de Zeta (http://codex.sigpipe.cz/zeta/docs/reference.rest#new-cls), aléatoire() est tiré de l'air mince.

+0

Ça marche presque! Tout ce que je devais faire était de supprimer le trait de soulignement après 'nouveau'. Merci! –

+0

Ajoutez 'Math.' devant ce truc que vous avez tiré de l'air si vous voulez le faire fonctionner. – Amarghosh

+0

Math.random renvoie les valeurs flottantes de la plage [0, 1). vous voudriez que sth comme ceci: fonction getRandomInt (min, max) { retourner Math.floor (Math.random() * (max - min + 1)) + min; } –

0

Je ne pense pas qu'il existe un moyen direct de le faire. Mais vous pouvez essayer cette chose.

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

vient ici Programmation Orientée Objet:

déclarer le type de votre variable en tant que type de super classe commune (ou une interface) et d'étendre (ou mettre en œuvre) toutes les classes possibles de cette super-classe (ou interface) .

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(); 

Voici un exemple en utilisant des interfaces:

public interface MyType 
{ 
} 
public class Type1 implements MyType 
{ 
} 
public class Type2 implements MyType 
{ 
} 
public class Type3 implements MyType 
{ 
} 
+0

C'est exactement ce que j'ai l'intention de faire ... mais je ne voulais pas écrire un long commutateur/if qui ressemblait à "if (randomnumber == 1) {do this} else if ... ". Désolé que la partie n'était pas claire. Mais oui, utiliser OO c'est absolument l'approche à adopter. –

0

Je pense que vous devriez être en mesure de faire quelque chose comme:

var classes:Array = [Class1, Class2, Class3]; 
var obj:Obj = new classes[0]; 

Chaque classe aura probablement à mettre en œuvre une interface partagée rends-le utile. Donc, il ressemblerait à quelque chose comme:

var classes:Array = [Class1, Class2, Class3]; 
var obj:IInterface = (new classes[0]) as IInterface; 
0

Je suggère ce qui suit si vous avez plusieurs classes: Class1, Class2, CLASS3 qui étendent tous AbstractItem

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

Si vous faites cela, vous devez vous assurer que les classes sont utilisées ailleurs dans votre code, sinon vous ne les compilerez pas. – grapefrukt

+0

vrai, vous pouvez facilement corriger cela en faisant les variables correspondantes pour vous assurer que les classes sont compilées : var article: Class1; var article: Class2; var article: Class3; –

0

C'est ce que la réponse de just somebody ressemblerait dans la syntaxe AS3 appropriée.

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

Si les classes n'ont pas de super-classe commune, vous pouvez garder myObj non typé.