AS3动态创建对象的实例

时间:2013-11-24 22:10:01

标签: actionscript-3 flash actionscript

我有一个类,它包含以下方法将对象放在舞台上。

public function createBox()
{
    var box:Ball1 = new Ball1();
    addChild(box);
    box.addEventListener(Event.ENTER_FRAME, boxF);
}

我想要做的是将对象名称传递给方法,然后加载该对象,从而允许我对不同的对象使用相同的方法。

一个非工作的例子:

public function createBox( obj )
{
    var box:obj = new obj();
    addChild(box);
    box.addEventListener(Event.ENTER_FRAME, boxF);
}

这可能吗?

由于

2 个答案:

答案 0 :(得分:2)

现有答案的更敏捷版本是使用getDefinitionByName(),它允许您根据输入字符串构建类。

使用此功能,您可以将方法重写为:

public function produce(className:String):*
{
    var type:Class = getDefinitionByName(className) as Class;
    return new type();
}


高级:

为了使这个更严格和更易于维护(使得只有某些工厂可以创建某些类),您可以使用接口在给定工厂和它可以生成的类之间建立关系。下面是一个小例子。

说工厂EnemyFactory会创建一些你认为是游戏中敌人的物体。我们不希望能够创建拾取器,粒子和其他非敌人类型的对象。我们可以创建一个接口IEnemyProduct,它由允许EnemyFactory创建的类实现。界面可以简单如下:

public interface IEnemyProduct{}

任何敌人的类都可以实施。然后可以将EnemyFactory的{​​{1}}函数修改为更易读的版本,如下所示:

produce()

在这种情况下,如果生成的类没有实现public function produce(enemyClassName:String):IEnemyProduct { var type:Class = getDefinitionByName(enemyClassName) as Class; return new type() as IEnemyProduct; } produce()将返回null。这里的目标是明确哪些工厂负责哪些对象,一旦项目变大,这是一个很大的优势。使用接口而不是基类也意味着您可以实现多个接口并使多个工厂生成类。

答案 1 :(得分:0)

您可以使用简单的工厂或类似的工具:

  public class Factory
  {
      public static function produce(obj:String)
      {
          if (obj == "obj1")
          {
              return new obj1();
          } else if (obj == "obj2") {
              return new obj2();
          }
      }
  }