2014-03-18 13 views
1

我想開發一個動作方法,它將一個Class對象作爲參數,並在運行時生成該類的一個實例:如何確定一個Class對象是否代表一個類或動作3.0中的接口

public function getComponent(componentType:Class):Object 
{ 
    return new componentType(); 
} 

在某些情況下,我可能會傳遞一個代表接口的Class對象。當然,我不能直接創建一個接口的實例。

有沒有一些方法來查詢Class對象,並確定它是否代表一個接口,以便我可以避免嘗試以這種方式創建一個實例?

回答

1

假設您遵循接口類的命名約定,如標準IInterfaceName中所示,接口的名稱前綴大寫字母「I」,後跟大寫字母和類名的其餘部分。有幾種方法可以做到這一點。如果你有很多,可能因爲你可以這樣做一個參數傳遞不同的接口:

首先導入flash.utils.getQualifiedClassName和你的函數:

public function getComponent(componentType:Class):Object 
{ 
    var name:String = getQualifiedClassName(componentType).replace(/.*\:+/g,""); 
    if (name.search(/^\I[A-Z]/g) != -1) { 
     trace("parameter is an interface!"); 
     return null; 
    } 
    return new componentType(); 
} 

您不必設置名稱變量,但這有助於使搜索更嚴格一些。你可能只是這樣做,而不是:

if (getQualifiedClassName(componentType).search(/\I[A-Z]/g) != -1) { 
    trace("parameter is an interface!"); 
    return null; 
} 

如果你是不是已經知道,getQualifiedClassName返回類名稱的字符串格式。正則表達式特別檢查大寫的IInterfaceName樣式字符串。

最後,如果你知道這只是一個接口,你可以簡單的只是這樣做:

if (componentType == IMyinterface) { 
    trace("component is a IMyinterface"); 
} 
+0

此時實施命名方案並不是真正的選擇。我正在開發的應用程序有數千個類,並且他們並不都遵循您提到的約定。我意識到運行時類型反射並不是真的在actionscript的控制之下。 – spierepf

1

一些細緻的試驗和錯誤之後,我想出了以下功能:

public static function isInterface(clazz:Class):Boolean 
{ 
    return describeType(clazz).factory.extendsClass.(@type=="Object").length()==0; 
} 

有誰知道這個條件是否總是適用於所有的actionscript接口?

1

我認爲這會爲你工作:

getQualifiedSuperclassName(classObject); 

如果你傳遞一個接口,接口沒有一個超這將返回null。它總是會給你任何類的結果,因爲每個類基本上是一個對象:)

無論如何,我不認爲將這樣的混合值傳遞給函數是一個好主意;)並檢查是否班級以「我」開始更糟(對不起貝內特:))

ps 請記住,describeType極其緩慢!

+0

很好的答案。我並不反對我的實施不理想。 –

相關問題