如何在ActionScript 3中正确测试类继承?

5
在ActionScript 3中,您可以使用以下方法确定对象O是类C的实例还是扩展或实现类C(直接或间接)的实例:...
if (O is C) {
    ...
}

我想要做的是测试类CC是否扩展或实现了类C(直接或间接),而不必实例化一个对象。

在Java中,您可以使用...

if (C.isAssignableFrom (CC)) {
    ...
}
http://java.sun.com/javase/6/docs/api/java/lang/Class.html#isAssignableFrom(java.lang.Class) ActionScript 3怎么样?
谢谢!
6个回答

3

1
太好了,谢谢。从丰富的Java 6 API转来,我发现自己在Flash/Flex中经常不得不重新发明轮子,真是气死人啊 ;-). - jmdecombe
这样做是没问题的,但相对比较慢。如果你只是偶尔这么做,那就没关系了。但如果频繁操作,请考虑使用isPrototypeOf() - Tom Auger

1
我认为,你将不得不手动解析由flash.utils.describeType返回的XML对象。

仅仅通过查看类是无法确定类型的(除非使用 flash.utils.describeType)。你只能通过先实例化对象来做到这一点。 - Mims H. Wright
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/package.html#describeType() - Amarghosh
括号是链接的一部分。 - Amarghosh

0
值得考虑将Spicelib reflection库作为另一种选择进行包含。特别是ClassInfo.isType

检查由此ClassInfo实例表示的类或接口是否是指定类的子类或子接口

ClassInfo.forClass(A).isType(B);

0

或者,如果您使用as3commons-reflect包(顺便说一下,这个包非常有用),您可以调用:

ClassUtils.getImplementedInterfaces(CC)

0

这是我刚发现的一个技巧。 不确定它有多可靠,但对我来说有效。

var child:Child = getChild() as Parent;
if(child != null) {
    ...
}

-1

describeType() 在计算上非常慢。如果您需要确定未实例化类的继承链,请考虑使用 Class.prototypeprototype.isPrototypeOf()。这样可以检查继承和相等性,如果您只有类本身(而不是该类的实例对象)。

如果您只有类名的字符串表示形式(而不是类本身),则必须首先将其转换为正确的类,使用 flash.utils.getDefinitionByName(),假设您至少在代码中声明了该类。如果该类仅存在于已加载的 SWF 库中,则可能必须使用类似于 ApplicationDomain.currentDomain.getDefinitionByName()contextLoader.currentDomain.getDefinitionByName() 的内容。

以下是一个工作示例,它接受类或字符串类名,并检查第一个类是否在第二个类的继承链中。附加参数允许您决定是否返回 false,如果两个类相同而不是第一个扩展第二个。

/**
 * Determines whether the childClass is in the inheritance chain of the parentClass. Both classes must be declared
 * within the current ApplicationDomain for this to work.
 * 
 * @param   childClass
 * @param   parentClass
 * @param   mustBeChild
 */
public static function inheritsFrom(childClass:*, parentClass:*, mustBeChild:Boolean = false) {
    var child:Class,
        parent:Class;

    if (childClass is Class) {
        child = childClass;
    } else if (childClass is String){
        child = getDefinitionByName(childClass) as Class;
    }

    if (! child) {
        throw new ArgumentError("childClass must be a valid class name or a Class");
    }

    if (parentClass is Class) {
        parent = parentClass;
    } else if (parentClass is String){
        parent = getDefinitionByName(parentClass) as Class;
    }

    if (! parent) {
        throw new ArgumentError("parentClass must be a valid class name or a Class");
    }

    if (parent.prototype.isPrototypeOf(child.prototype)) {
        return true;
    } else {
        if (mustBeChild) {
            return false;
        } else {
            if (parent.prototype === child.prototype) {
                return true;
            }
        }
    }

    return false;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接