是否可以使用AS3反射来确定方法是否被重写?
我需要这样的方法:
protected function isOverriden(methodName:string) : bool
{
//magic here!
//...
return awesomeLocalVariable;
}因此,我将方法名称作为字符串传入,而isOverridden方法只有在对象具有该名称的方法并从其原始实现中被重写时才会生成true。
知道怎么在那里编码魔法吗?
谢谢。
编辑:根据请求,问题的上下文:
我正在构建一个创建AS3游戏的框架。我想为我的游戏对象提供“组件”,每个组件都为其应用的游戏对象提供功能。组件基于事件(onClick、onUpdate、onShapeCollision等)--我需要在组件类中使用这段代码,所以我只能注册实际组件派生类实现(重写)的事件。
示例组件:
public class CTrace extends ScriptComponent
{
public override function onClick(event:MouseEvent = null):void
{
trace(Owner.Id);
}
}框架应该将onClick方法注册为MouseEvent.CLICK事件的事件处理程序,因为它覆盖默认实现。
为什么我需要默认的实现?因为我希望类覆盖受支持的方法,所以如果用户尝试使用不受支持的事件,就会出现编译时错误。
这说得通吗?
发布于 2009-11-19 07:39:34
这是一次尝试。函数是静态的,它可以用于检查任何类或对象,而不管它是在哪个类中实现的。如果您给它类型,它将使用它,如果您给它一个实例,它将得到类型本身。内部逻辑只是检查我们正在寻找的函数的给定类型描述,如果存在并由类声明,它将检查父类中是否也存在该方法。如果两者都存在,享受吧,这意味着它被推翻了。
/**
* 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发布于 2009-11-19 03:54:24
如果您在同一个对象中询问,您可以
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,所以现在我无法确保我的想法正确工作。但我会回来的。
https://stackoverflow.com/questions/1760388
复制相似问题