首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3反射如何确定方法是否被重写?

AS3反射如何确定方法是否被重写?
EN

Stack Overflow用户
提问于 2009-11-19 01:41:29
回答 2查看 2.9K关注 0票数 3

是否可以使用AS3反射来确定方法是否被重写?

我需要这样的方法:

代码语言:javascript
复制
protected function isOverriden(methodName:string) : bool
{
    //magic here!
    //...

    return awesomeLocalVariable;
}

因此,我将方法名称作为字符串传入,而isOverridden方法只有在对象具有该名称的方法并从其原始实现中被重写时才会生成true。

知道怎么在那里编码魔法吗?

谢谢。

编辑:根据请求,问题的上下文:

我正在构建一个创建AS3游戏的框架。我想为我的游戏对象提供“组件”,每个组件都为其应用的游戏对象提供功能。组件基于事件(onClick、onUpdate、onShapeCollision等)--我需要在组件类中使用这段代码,所以我只能注册实际组件派生类实现(重写)的事件。

示例组件:

代码语言:javascript
复制
    public class CTrace extends ScriptComponent
    {
            public override function onClick(event:MouseEvent = null):void
            {
                    trace(Owner.Id);
            }
    }

框架应该将onClick方法注册为MouseEvent.CLICK事件的事件处理程序,因为它覆盖默认实现。

为什么我需要默认的实现?因为我希望类覆盖受支持的方法,所以如果用户尝试使用不受支持的事件,就会出现编译时错误。

这说得通吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-19 07:39:34

这是一次尝试。函数是静态的,它可以用于检查任何类或对象,而不管它是在哪个类中实现的。如果您给它类型,它将使用它,如果您给它一个实例,它将得到类型本身。内部逻辑只是检查我们正在寻找的函数的给定类型描述,如果存在并由类声明,它将检查父类中是否也存在该方法。如果两者都存在,享受吧,这意味着它被推翻了。

代码语言:javascript
复制
/**
 * 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

如果需要的话,它所需的进口:

代码语言:javascript
复制
import flash.utils.describeType;
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
import flash.utils.getQualifiedSuperclassName;

并利用它:

代码语言:javascript
复制
trace(isOverridden(ChildrenClass, "overriddenMethod")); //true
trace(isOverridden(ChildrenClass, "onlyChildMethod")); //false
trace(isOverridden(ChildrenClass, "onlyParentMethod")); //false
票数 2
EN

Stack Overflow用户

发布于 2009-11-19 03:54:24

如果您在同一个对象中询问,您可以

代码语言:javascript
复制
overriden = (this[stringNameOfMethod] instanceOf Function && super[stringNameOfMethod] instanceOf Function);

如果没有,请尝试使用describeType。检查是否有一个带有名称的方法,并检查"declaredBy“属性。瞧!

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

对不起,我正在从CS3迁移到Flash,所以现在我无法确保我的想法正确工作。但我会回来的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1760388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档