Как мне перечислить (потенциально большое количество) классов в определенном пакете? (AS3) - PullRequest
2 голосов
/ 12 декабря 2011

У меня есть x количество классов в пакете, например."com.trevorboyle.lotsofclasses", и я продолжаю добавлять больше (эти классы, вероятно, все будут статическими и, вероятно, будут расширять один и тот же класс).

Я хочу создать выпадающий список всех этих классов,желательно без необходимости вручную создавать массив.

Как только класс будет выбран из списка, я смогу использовать getDefinitionByName, чтобы вернуть его, потому что на данный момент я знаю его имя.

Вопрос в том, что, как я полагаю, в AS3 нет поддержки для перечисления всех классов в определенном пакете, есть ли шаблон проектирования, который обрабатывает это?

1 Ответ

3 голосов
/ 12 декабря 2011

Есть два способа:

Во-первых, традиционная чистая реализация as3:

Создайте класс, который регистрирует все интересующие вас классы при инициализации класса (когда он впервые используется в коде).

Примерно так:

package   {
import flash.utils.getQualifiedClassName;

public class ClassesRegister {

    private static const PACKAGE_RESOLVER_PATTERN   : RegExp = /^(?P<packageName>[a-zA-Z_\.]+)::/;

    private static const registeredClasses : Object = { };

    public static function registerClass ( clazz : Class ) : void {

        var packageName : String = PACKAGE_RESOLVER_PATTERN.exec( getQualifiedClassName( clazz ) ).packageName || "";


        if ( !registeredClasses[ packageName ] ) {
            registeredClasses[ packageName ] = [];
        }

        registeredClasses[ packageName ].push( clazz );

    }

    public static function getClassesOfPackage ( packageName : String ) : Array {

        return registeredClasses[ packageName ].concat();

    }

}

}

Класс, зарегистрированный при инициализации:

package   {

public class SomeClass {

    // Add class to register in static initializer
    {
        ClassesRegister.registerClass( SomeClass );
    }

    /**
     * Class constructor
     */
    public function SomeClass () {

    }

}

}

И есть еще один, не проверенный мной, но очень многообещающий: Используйте as3commons библиотеку байт-кода .

Class ByteCodeTypeCache в свойстве definitionNames хранит все полные имена определений, которые встречались во всем проверенном байт-коде. Вы можете просто просмотреть этот список и взять то, что вам нужно. Конечно, вы должны убедиться, что все классы, которые вам понадобятся во время выполнения, скомпилированы в байт-код (вы должны где-то инициализировать эти классы или использовать директивы компилятора as3).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...