在ActionScript 3中的类实例化之前运行代码

时间:2010-03-08 11:03:56

标签: actionscript-3 prototype factory introspection

我需要在实例化之前的类声明中运行代码。这对于在工厂中自动注册类特别有用。参见:

// Main.as
public class Main extends Sprite 
{
    public function Main() : void
    {
        var o : Object = Factory.make(42);
    }
}

// Factory.as
public class Factory
{
    private static var _factory : Array = new Array();

    public static function registerClass(id : uint, c : Class) : void
    {
        _factory[id] = function () : Object { return new c(); };   
    }

    public static function make(id : uint) : Object
    {
        return _factory[id]();
    }
}

// Foo.as
public class Foo
{
    // Run this code before instanciating Foo!
    Factory.registerClass(CLASS_ID, Foo);

    public static const CLASS_ID : uint = 42;
}

AFAIK,ActionScript语言的JIT机器不允许我这样做,因为在Foo方法中没有引用Main。正在生成Foo类,我不能(也不想)在Main中注册类:我想在特定包(或库)中注册所有导出的类。理想情况下,这可以通过包内省来完成,而ActionScript 3中并不存在。

您知道我的设计问题的任何修复(或其他解决方案)吗?

2 个答案:

答案 0 :(得分:0)

我不是100%确定这是否是您所追求的,但您尝试过使用静态初始化程序吗?

public class Foo
{
    // Static Initializer
    {
        Factory.registerClass(CLASS_ID, Foo);
    }

    public static const CLASS_ID : uint = 42;
}

http://life.neophi.com/danielr/2006/12/static_initializers_in_as3.html

答案 1 :(得分:0)

您可以使用编译器选项在生成的SWF或SWC中包含类字节代码。但您必须使用MXMLC(或SWPC的COMPC)进行编译。