如何在静态成员变量初始化中获取类定义?

时间:2014-08-12 10:26:55

标签: actionscript-3 class static-members

我有这个代码可以工作,但想要改进它:

public class VisibleComponent extends Component
{
    static private var itz:Initializer = new Initializer(VisibleComponent);

    // ... omitted
}

public class Initializer
{
    public function Initializer(type:Class)
    {
        Component.registerType(type);
    }
}

我想知道的是:

我可以自动获取VisibleComponent的类对象(定义)吗?

(而不是手动复制粘贴VisibleComponent)?

例如:

public class VisibleComponent extends Component
{
    // not working because `static` member dont have `this`
    static private var itz:Initializer = new Initializer(this.constructor as Class);
}

public class VisibleComponent extends Component
{
    // how to do?
    static private var itz:Initializer = new Initializer(getMyDefinition());
}

我要做的是在程序执行开始时建立一个Dictionary stringClass,一个条目反映一个派生类扩展Compoenent }。

因此,对于static成员变量,此初始化将在一开始就发生,并且对于每个扩展Component的类只会发生一次。

谢谢!

1 个答案:

答案 0 :(得分:0)

使Initializer成为工厂并在那里注册组件。

package {

  public class ComponentFactory {

    private static var _pool:Object = {}; // or make it a final const

    public function create(className:String):Component {
      var clazz:Class = getDefinitionByName(className) as Class;
      if (!clazz) {
        throw new Error("Class not found.");
      }
      return register(Component(new class())); // fail fast
    }

    protected function register(c:Component):Component {
      // register the component
      // add dependencies
      // log what you need to log
      return c;
    }

    protected function unregister(c:Component):Component {
      // unregister the component
      // removed dependencies properly
      // log what you need to log
      return c;
    }
  }
}

更容易实现,理解并提供适当的子类化......并且您的组件不需要知道任何有关方式的信息,需要创建它们。对此,这是更重要的方面。