2010-03-25 27 views
9

Với mã nàyAS3 - Tôi có thể biết nếu một lớp thực hiện một giao diện (hoặc là một lớp con của một lớp khác)?

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

ví dụ: So sánh classParam với giao diện IEventDispatcher:

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

Tôi biết nó không thể được thực hiện với is điều hành. Nhưng, có cách nào để làm điều đó không? Có cách nào để biết nếu một lớp thực hiện một số giao diện? (Hoặc là một lớp con của lớp khác?)

giải pháp có thể:

A. Tạo một đối tượng của classParam và sử dụng đối tượng đó để so sánh sử dụng is điều hành.

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

B. Sử dụng describeType()

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

Có một cách mà không sử dụng describeType hoặc tạo ra một nhà điều hành new?

Trả lời

6

tôi không thấy cách nào để đạt được những gì bạn đang cố gắng để làm ngoại trừ bằng cách sử dụng describeType.
Nó đã được tạo ra cho mục đích này, tại sao bạn không muốn sử dụng nó?

Edit:
Nó thực sự chỉ mất 2 dây chuyền để làm điều này:

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

... hoặc chỉ trong một, nếu đó là những gì làm phiền bạn:

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

Điều làm phiền tôi là tốc độ của 'descriptionType'. Nó có chậm không? –

+0

Nó phụ thuộc vào số lượng bạn đang sử dụng nó, nhưng có, nó khá chậm. Vấn đề là tôi không nghĩ có một cách khác để đạt được điều này. Bài viết này có thể bạn quan tâm, tác giả đã thực hiện một điểm chuẩn và phát hiện ra rằng một descriptionType trên UIComponent mất 5ms trên máy tính của mình: http://faindu.wordpress.com/2010/02/01/actionscript-flex-dependency-injection-performance/ –

+0

Vì vậy, việc tạo đối tượng sẽ mất ít thời gian hơn? Tôi sẽ chạy một điểm chuẩn trên đó để xem nó. –

0

Thêm vào 'Zed -K 'phản ứng. Tôi đã không cần phần. Đây là một ví dụ về một thử nghiệm kiểm tra xem lớp đó có đang sử dụng và giao diện hay không. '_instance' là lớp đang được kiểm tra.

[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

Có thể là không. Btw, cũng có describeTypeJSON, phù thủy nhanh hơn khoảng 5 lần so với describeType.

Các vấn đề liên quan