Выбор класса динамически в Actionscript 3 - PullRequest
0 голосов
/ 17 ноября 2009

У меня есть такая строка кода:

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

Я хочу выбрать, к какому классу этот объект будет принадлежать случайным образом во время выполнения. Есть ли способ сделать это в Actionscript 3?

Ответы [ 6 ]

1 голос
/ 17 ноября 2009

Я не знаю, насколько хорошо это будет летать в AS3, но в JS я бы использовал

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

может быть, это будет работать и в AS3?

new_ является частью Зетов (http://codex.sigpipe.cz/zeta/docs/reference.rest#new-cls), random () извлекается из воздуха.

0 голосов
/ 17 ноября 2009

Это то, на что просто кто-то ответ будет выглядеть в правильном синтаксисе AS3.

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

Если у классов нет общего суперкласса, вы можете оставить myObj нетипизированным.

0 голосов
/ 17 ноября 2009

Я предлагаю следующее, если у вас есть несколько классов: Class1, Class2, Class3, которые все расширяют AbstractItem

var itemClass:Class = getDefinitionByName("com.packagename.Class" + Math.floor(Math.random()*3 +1)) as Class;
var item:AbstractItem = new itemClass();
0 голосов
/ 17 ноября 2009

Я думаю, вы должны быть в состоянии сделать что-то вроде:

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 голосов
/ 17 ноября 2009

Здесь идет объектно-ориентированное программирование:

Объявите тип вашей переменной как тип общего суперкласса (или интерфейса) и расширьте (или реализуйте) все возможные классы из этого суперкласса (или интерфейса).

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 голосов
/ 17 ноября 2009

Я не думаю, что есть прямой способ сделать это. Но вы можете попробовать это.

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)\]();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...