gpt4 book ai didi

actionscript-3 - AS3反射。如何判断一个方法是否被覆盖?

转载 作者:行者123 更新时间:2023-12-02 02:35:58 24 4
gpt4 key购买 nike

是否可以使用 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 事件的事件处理程序,因为它会覆盖默认实现。

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

这有意义吗?

最佳答案

这是一个尝试。该函数是静态的,它可用于检查任何类或对象,而不管它在哪个类中实现。如果你给它类型,它会使用它,如果你给它一个实例,它会自己获取类型。内部逻辑只是检查我们正在寻找的函数的给定类型描述,如果存在并且由类声明,它将检查该方法是否也存在于父类中。如果两者都存在,享受,这意味着它被覆盖了。

/**
* 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

关于actionscript-3 - AS3反射。如何判断一个方法是否被覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1760388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com