AS3 отражение. Как узнать, переопределен ли метод? - PullRequest
3 голосов
/ 19 ноября 2009

Можно ли использовать отражение AS3, чтобы узнать, был ли метод переопределен?

Мне нужен метод, подобный:

protected function isOverriden(methodName:string) : bool
{
    //magic here!
    //...

    return awesomeLocalVariable;
}

Итак, я передаю имя метода в виде строки, а метод isOverridden возвращает true, только если и только если у объекта есть метод с таким именем и он переопределяется из своей первоначальной реализации.

Есть идеи, как закодировать там магию?

Спасибо.

Редактировать: По запросу, контекст проблемы:

Я создаю основу для создания игр для AS3. Я хочу предоставить «компоненты» для моих игровых объектов, каждый компонент обеспечивает функциональность для игрового объекта, к которому он применяется. Компоненты основаны на событиях (onClick, onUpdate, onShapeCollision и т. Д.). Мне нужен этот код в классе Component, поэтому я могу регистрировать только те события, которые реализует класс, производный от Component (переопределяет).

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

    public class CTrace extends ScriptComponent
    {
            public override function onClick(event:MouseEvent = null):void
            {
                    trace(Owner.Id);
            }
    }

Фреймворк должен зарегистрировать метод onClick в качестве обработчика событий для события MouseEvent.CLICK, поскольку он переопределяет реализацию по умолчанию.

Зачем мне нужна реализация по умолчанию? Потому что я хочу, чтобы классы переопределяли поддерживаемые методы, поэтому произойдет ошибка времени компиляции, если пользователь попытается использовать неподдерживаемое событие.

Имеет ли это смысл?

Ответы [ 2 ]

2 голосов
/ 19 ноября 2009

Вот попытка. Функция является статической и может использоваться для проверки любого класса или объекта независимо от класса, в котором она реализована. Если вы дадите ему тип, он будет использовать его, если вы дадите ему экземпляр, он сам получит тип. Внутренняя логика состоит в том, чтобы просто проверить данное описание типа для функции, которую мы ищем, если она существует и объявлена ​​классом, она проверит, существует ли метод в родительском объекте. А если и то, и другое существует, наслаждайтесь, это значит, что оно отменено.

/**
 * Returns true only if the method name given is declared by
 * the source class, and any parent class.
 */
static public function isOverridden(source:*, methodName:String):Boolean {
    var parentTypeName:String = getQualifiedSuperclassName(source);
    if (parentTypeName == null) {
        return false;
    }//if

    var typeName:String = getQualifiedClassName(source);
    var typeDesc:XML = describeType(getDefinitionByName(typeName));
    var methodList:XMLList = typeDesc.factory.method.(@name == methodName);

    if (methodList.length() > 0) {
        //Method exists
        var methodData:XML = methodList[0];
        if (methodData.@declaredBy == typeName) {
            //Method is declared in self
            var parentTypeDesc:XML = describeType(getDefinitionByName(parentTypeName));
            var parentMethodList:XMLList = parentTypeDesc.factory.method.(@name == methodName);
            return parentMethodList.length() > 0;
        }//if
    }//if

    return false;
}//isOverridden

И на всякий случай, импорт необходим для его работы:

import flash.utils.describeType;
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
import flash.utils.getQualifiedSuperclassName;

И использовать его:

trace(isOverridden(ChildrenClass, "overriddenMethod")); //true
trace(isOverridden(ChildrenClass, "onlyChildMethod")); //false
trace(isOverridden(ChildrenClass, "onlyParentMethod")); //false
0 голосов
/ 19 ноября 2009

Если вы спрашиваете внутри того же объекта, вы можете

overriden = (this[stringNameOfMethod] instanceOf Function && super[stringNameOfMethod] instanceOf Function);

Если нет, попробуйте использовать descriptionType. Проверьте, существует ли метод с именем, и проверьте атрибут "DeclaBy". Voila!

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/package.html#describeType()

Извините, я нахожусь в процессе перехода от CS3 к Flash Builder, поэтому пока я не могу гарантировать, что мои идеи работают правильно. Но я вернусь.

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