Выполнить код перед созданием класса в ActionScript 3 - PullRequest
0 голосов
/ 08 марта 2010

Мне нужно запустить код в объявлении класса до его экземпляра. Это было бы особенно полезно для автоматической регистрации классов на фабрике. См:

// 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, машина JIT для языка ActionScript не позволит мне сделать это, поскольку в методе Main не делается никаких ссылок на Foo. При создании класса Foo я не могу (и не хочу) регистрировать классы в Main: я хочу зарегистрировать все экспортированные классы в определенном пакете (или библиотеке). В идеале это можно сделать с помощью самоанализа пакета, которого нет в ActionScript 3.

Знаете ли вы какое-либо решение (или другое решение) моей проблемы с дизайном?

Ответы [ 2 ]

0 голосов
/ 02 июня 2012

Вы можете использовать опции компилятора для включения байтового кода класса в результирующий SWF или SWC. Но вы должны скомпилировать с MXMLC (или COMPC для SWC).

0 голосов
/ 09 марта 2010

Я не уверен на 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

...