2009-11-07 65 views
5

在ActionScript 3,你可以计算出对象O是否是C类的或扩展或使用实现了C类(直接或间接)一类...如何正确测试ActionScript 3中的类继承?

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的?

谢谢!

回答

3

您可以直接在CC调用的describeType()。您不必实例化对象。

var typeXML:XML = describeType(CC); 
if(typeXML.factory.extendsClass.(@type=="C").length() > 0) 
{ 
... 

它没有我想要的那样干净,但我找不到更好的东西。

(通过Amarghosh:[http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/package.html#describeType()][1]

+1

太好了,谢谢。来自丰富的Java 6 API,我发现自己必须随时使用Flash/Flex,grrr ;-)重新发明轮子。 – jmdecombe 2009-11-10 15:38:24

+0

这很好,但相对较慢。如果你偶尔会这样做,那就没问题。否则,请考虑'isPrototypeOf()'。 – 2014-08-13 16:58:34

1

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

+0

没有办法通过查看类来简单地确定类型(除了使用'flash.utils.describeType')。您只能通过首先实例化对象来完成此操作。 – 2009-11-07 20:34:58

+0

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/package.html#describeType() – Amarghosh 2009-11-09 06:38:30

+0

*圆括号是链接的一部分 – Amarghosh 2009-11-09 08:28:34

0

另外,如果你使用as3commons-reflect包(这是非常,非常有用的,顺便说一句),您可以拨打:

ClassUtils.getImplementedInterfaces(CC) 
0

值得包括Spicelib reflection库作为另一种选择。具体ClassInfo.isType。本实例的ClassInfo代表 类或接口

检查是否是 指定类

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

下面的一个子类或子接口是我刚刚发现一个黑客。 不知道它有多坚实,但它适用于我。

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

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

如果您只有类名称的字符串表示形式(与类本身相反),则必须先将其转换为适当的类,并使用flash.utils.getDefinitionByName(),假设您至少在代码中声明了该类。如果该类仅存在于加载的SWF库中的某处,则可能必须使用类似ApplicationDomain.currentDomain.getDefinitionByName()contextLoader.currentDomain.getDefinitionByName()之类的内容。

下面是一个工作示例,它接受Classes或String类名,并检查第一个是否在第二个继承链中。额外的参数允许您决定如果两个类是相同的而不是第一个扩展第二个类,那么是否要返回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; 
}