2008-11-22 9 views
21

Tôi muốn làm điều này trong Actionscript:Cách kiểm tra xem hai đối tượng có cùng loại trong Actionscript không?

typeof(control1) != typeof(control2) 

để kiểm tra xem hai đối tượng đều cùng loại. Điều này sẽ làm việc tốt trong C#, nhưng trong Actionscript nó không. Trong thực tế, nó trả về 'object' cho cả hai biểu thức typeof() vì đó là cách Actionscript hoạt động.

Tôi dường như không tìm thấy phương án thay thế bằng cách tìm trong trình gỡ lỗi hoặc trên các trang mô tả typeof() trong Actionscript.

Có cách nào để nhận loại thời gian chạy thực tế không?

Trả lời

19

Cách tốt nhất là sử dụng flash.utils.getQualifiedClassName(). Ngoài ra, bạn có thể sử dụng flash.utils.describeType() để nhận tài liệu XML mô tả thêm về lớp học.

+0

Bạn sẽ nghĩ rằng đây sẽ là hành vi mặc định, nhưng ActionScript biết ... tốt hơn? –

+0

tôi tin rằng 'getQualifiedClassName' chậm hơn toán tử' is'. tuy nhiên, nó cũng cho phép so sánh với các chuỗi thay vì các lớp, có thể hữu ích để tránh việc biên dịch các lớp mà bạn không sử dụng (nhưng vẫn có thể kiểm tra các kiểu đối tượng). – ericsoco

4

Bạn sẽ muốn sử dụng Object.prototype.constructor.

Từ documentation:

dynamic class A {} 
    trace(A.prototype.constructor);  // [class A] 
    trace(A.prototype.constructor == A); // true 
    var myA:A = new A(); 
    trace(myA.constructor == A);   // true 

(thuận, đây cũng là làm thế nào để kiểm tra các loại trong javascript, đó là những gì ban đầu dẫn tôi đến đây trong các tài liệu)

Vì vậy, để kiểm tra này ra trước khi tôi đăng ở đây, tôi đã thử nó trong một ứng dụng tôi có, trong một lớp có tên là Player. Kể từ khi thuộc tính prototype là tĩnh, bạn không thể gọi nó là sử dụng "này", nhưng bạn chỉ có thể bỏ qua định phạm vi và nó hoạt động:

public function checkType():void { 
    trace(prototype.constructor, prototype.constructor == Player); 
    // shows [class Player] true 
} 
+1

Điều đáng nói đến là nếu bạn muốn sử dụng điều này trên một lớp không được đánh dấu là động, bạn phải truyền đối tượng đó đến một đối tượng trước tiên. Object (myA) .constructor – Clintm

1

Nếu bạn muốn chiếm quyền thừa kế, sau đó bạn có thể muốn thử một cái gì đó như thế này:

if (objectA is objectB.constructor || objectB is objectA.constructor) 
{ 
    // ObjectA inherits from ObjectB or vice versa 
} 
17

Actionscript 3 có một nhà điều hành có thể được sử dụng để so sánh các đối tượng. Xét đoạn mã sau:

var mySprite:Sprite = new Sprite(); 
var myMovie:MovieClip = new MovieClip(); 

trace(mySprite is Sprite); 
trace(myMovie is MovieClip); 
trace(mySprite is MovieClip); 
trace(myMovie is Sprite); 

Mà sẽ cho kết quả sau:

true 
true 
false 
false 

này sẽ làm việc cho class built-in, và các lớp bạn tạo ra. Số hành động 2 tương đương với là nhà điều hànhinstanceof.

0
Object obj = new Object(); 
Object o = new Object(); 

if(o.getClass().getName().endsWith(obj.getClass().getName())){ 
    return true;  
}else{ 
     return false; 
} 
0

Tổng quát hơn, nếu bạn muốn kiểm tra xem objectA là một subtype của objectB

import flash.utils.getDefinitionByName; 
import flash.utils.getQualifiedClassName; 

... 

if (objectA is getDefinitionByName(getQualifiedClassName(objectB))) 
{ 
    ... 
} 
3

Có cách nào để có được những kiểu thời gian chạy thực tế?

Có.

var actualRuntimeType:Class = Object(yourInstance).constructor; 

Một số câu trả lời khác đã tham khảo .constructor, nhưng bạn có thể không phải lúc nào truy cập trực tiếp .constructor trong ActionScript 3.Nó chỉ có thể truy cập trên dynamic lớp học, mà hầu hết các lớp học thì không. Cố gắng sử dụng nó trên một lớp thông thường sẽ gây ra một lỗi biên dịch theo các thiết lập mặc định.

Tuy nhiên, vì mỗi lớp được kế thừa từ Object, là dynamic, chúng tôi có thể tra cứu tài sản .constructor của chúng tôi chỉ bằng cách truyền một phiên bản thành Object.

Vì vậy nếu chúng ta không quan tâm đến các lớp con, chúng ta có thể xác nhận rằng hai trường hợp là chính xác cùng lớp bằng cách đơn giản đánh giá này:

Object(instanceA).constructor === Object(instanceB).constructor; 

Tôi đã học được điều này từ bài "Get the class used to create an object instance in AS3" bởi Josh Tynjala .


Một thay thế thậm chí đơn giản hơn mà cũng làm việc cho tôi chỉ là:

var actualRuntimeType:Class = yourInstance["constructor"]; 

Thời gian chạy là hoàn toàn có khả năng đem lại cho bạn những .constructor, nó chỉ là trình biên dịch phàn nàn nếu bạn sử dụng cú pháp đó. Sử dụng ["constructor"] nên sản xuất cùng một bytecode, nhưng trình biên dịch không đủ thông minh để ngăn bạn.

Tôi đã bao gồm điều này vì nó chưa được kiểm tra ở bất kỳ đâu ngoại trừ môi trường Flash hiện tại của tôi, trong khi một số người dùng đã nói rằng phương pháp được mô tả ở trên hoạt động cho họ.

+0

Thủ thuật rất gọn gàng, mặc dù nó không hoạt động với VectorCollection. – Tox