2011-07-13 8 views
3

Actionscript 3では、Classオブジェクトが指定されている場合、そのクラスが別のクラスから継承されているかどうかを判断する方法はありますか?私はクラスをインスタンス化してisキーワードでチェックしたくありません。クラスのスーパークラスを実行時にどのように決定できますか?

具体的には、私はこの機能を動作させるためにしようとしている:

public function validateClass(classObj:Class):EngineObject{ 
    if(classObj extends EngineObject){ 
     return new classObj(); 
    } else { 
     throw new Error("Given class is not a subclass of EngineObject!"); 
    } 
} 

編集:inはAS3

+0

まず、 'in'は予約語ですが、変数として使用することはできません。 –

+0

私はこれの使用例に興味があります。それは、それができることができる答えからのように見えますが、インターフェイスでそれができないことを何を探していますか? –

答えて

2

に予約されていることを忘れてはflash.utils.getQualifiedSuperclassName()flash.utils.getQualifiedClassName()

を見てくださいあなたの機能はこのように見えるかもしれません。

import flash.utils.getQualifiedSuperclassName; 
import flash.utils.getQualifiedClassName; 

public function validateClass(cl:Class):EngineObject{ 
    if(getQualifiedSuperclassName(cl) == getQualifiedClassName(EngineObject)){ 
     return new cl(); 
    } else { 
     throw new Error("Given class is not a subclass of EngineObject!"); 
    } 
} 

しかし、これは単一の反復の深さでのみ機能します。

レベルがobjectになるまで、各繰り返しステップでこれを行うことができます。ここでは完全なアプローチです。

public function validateClass(cl:Class):EngineObject 
{ 
    if (getQualifiedSuperclassName(cl) == getQualifiedClassName(EngineObject)) 
    { 
     return new cl(); 
    } 

    var sup:Class = getDefinitionByName(getQualifiedSuperclassName(cl)) as Class; 
    if (sup == null || getQualifiedSuperclassName(sup) == getQualifiedClassName(Object)) 
    { 
     throw new Error("Given class is not a subclass of EngineObject!"); 
    } 

    return validateClass(sup); 
} 
+0

私の答えはObjectまで祖先をすべてチェックしますが、テストされていません – shanethehat

+0

一方で完全なソリューションを構築してテストしています;-) – DanielB

+0

whileループの代わりに再帰を使用するとパフォーマンス上の利点はありますか? – shanethehat

1

あなたはどのタイプがから延びたクラスのすべてを把握するためにdescribeTypeを使用し、他の興味深いものがたくさんできました。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/package.html#describeType()

describeTypeあなたがクラスについて知りたいと思いますほとんどすべてを持つXMLを返します。 extendsClassというすべての要素をループし、その属性のtypeとあなたが選んだクラス名を比較するだけです。クラス名を調べるには、比較対象の型にgetQualifiedClassNameを使用してください。

1
function validateClass($class:Class):EngineObject { 
    var qn:String = getQualifiedClassName($class); 
    var en:String = getQualifiedClassName(EngineObject); 
    while(qn != "Object") { 
     if(qn == en) return new $class(); 
     qn = getQualifiedSuperclassName(getDefinitionByName(qn)); 
    } 
    throw new Error("Given class is not a subclass of EngineObject!"); 
} 

ここでのアイデアは、スーパークラスの修飾名を取得し、EngineObjectの修飾名と比較されます。一致しない場合は、スーパークラスが新しいクラス名として設定され、ループが再度実行されます。修飾されたスーパークラス名がObjectの場合は、それ以上の祖先がないことがわかります。

関連する問題