2010-03-25 128 views
9

有了這個代碼AS3 - 我可以知道一個類是否實現了一個接口(或者是另一個類的子類)?

function someFunction(classParam:Class):Boolean 
{ 
    // how to know if classParam implements some interface? 
} 

即與IEventDispatcher接口比較classParam

someFunction(EventDispatcher) // returns true 
someFunction(Object) // returns false 

我知道它不能與is運營商來完成。但是,有沒有辦法做到這一點?有沒有辦法知道一個類是否實現了一些接口? (或者是其他類的子類?)

可能的解決方案:

A.創建的classParam對象,並使用該對象使用is符來比較。

function someFunction(classParam:Class):Boolean 
{ 
    return (new classParam()) is IEventDispatcher 
} 

B.使用describeType()

function someFunction(classParam:Class):Boolean 
{ 
    var xml:XML = describeType(classParam) 
    // found "implementsInterface" value in xml and compare to IEventDispatcher 
} 

有不使用describeType或創建一個new操作的方法嗎?

回答

6

我看不出有任何的方式來實現你想除非使用describeType做什麼。
它是爲此目的而創建的,爲什麼你不想使用它?

編輯:
它實際上只需要2行做到這一點:

var classDescription:XML = describeType(classParam); 
return (classDescription.factory.implementsInterface.(@type == getQualifiedClassName(IEventDispatcher)).length() != 0); 

...或者只是一個,如果它是什麼困擾你:

return (describeType(classParam).factory.implementsInterface.(@type == getQualifiedClassName(IEventDispatcher)).length() != 0); 
+0

困擾我的是'describeType'的速度。不是很慢嗎? – 2010-03-25 23:13:51

+0

這取決於你使用它的程度,但是,這很慢。問題是我不認爲有另一種方法來實現這一點。本文可能會讓你感興趣,作者做了一個基準,並發現UIComponent上的describeType在他的計算機上需要5ms:http://faindu.wordpress.com/2010/02/01/actionscript-flex-dependency-injection-performance/ – 2010-03-26 09:02:24

+0

因此創建對象需要更少的時間?我將運行一個基準來看看它。 – 2010-03-26 13:11:27

0

添加到「捷思銳-K'的迴應。我最終不需要.factory部分。這是一個檢查該類正在使用和接口的測試示例。 '_instance'是被測試的類。

[Test] 
public function testInstanceShouldBeIUser():void 
{ 
    var classDescription:XML = describeType(_instance); 
    var type:String = getQualifiedClassName(IUser); 
    var xmlList:XMLList = classDescription.implementsInterface.(@type == type); 
    assertTrue("expected IUser", xmlList.length() != 0); 
} 
0

可能不是。順便說一句,也有describeTypeJSON,女巫比describeType快約5倍。

相關問題