2009-11-07 26 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; 
}