2011-12-11 47 views
9

Tôi có một trò chơi với nhiều loại tàu khác nhau. Lớp Ship của tôi có một mảng tĩnh giữ một trong mỗi loại trong đó. Bất cứ khi nào tôi thực hiện một mới Ship (khác với khi khởi tạo mảng này), tôi muốn làm cho nó một bản sao của một trong những đối tượng hiện có Ship trong mảng nguyên mẫu của tôi.AS3 - Sao chép một đối tượng

1 - Làm thế nào tôi có thể chạy qua tất cả các thuộc tính trong một đối tượng Ship và gán chúng cho đối tượng Ship thứ hai?

2 - Làm cách nào để xem thuộc tính có phải là đối tượng hay loại cơ bản như String hoặc int? Một số đối tượng trong lớp Ship của tôi cần được nhân bản và một số chỉ là các tham chiếu cần giữ nguyên.

Trả lời

19

Một lựa chọn, cho là nhanh nhẹn nhất, sẽ được xác định phương pháp clone cho mỗi lớp mà bạn cần phải sao chép, chẳng hạn như:

class Ship 
{ 
    public var prop1:Number; 
    public var otherClassInstance:OtherClass; 
    public function clone():Ship 
    { 
     var result:Ship = new Ship(); 
     result.prop1 = this.prop1; 
     result.otherClassInstance = this.otherClassInstance.clone() 
    } 
} 

class OtherClass 
{ 
    public var prop1:Number; 
    public function clone():OtherClass 
    { 
     var result:OtherClass = new OtherClass(); 
     result.prop1 = this.prop1; 
    } 
} 

Một lựa chọn khác là để sao chép một đối tượng bằng cách sử dụng các lớp ByteArray như ví dụ này từ tài liệu Adobe:

function clone(source:Object):* 
{ 
    var myBA:ByteArray = new ByteArray(); 
    myBA.writeObject(source); 
    myBA.position = 0; 
    return(myBA.readObject()); 
} 

Tôi đã thấy các trường hợp phương pháp này không hoạt động để sao chép các cá thể của lớp tùy chỉnh, đặc biệt xem các lớp như Sprites.

Cách tiếp cận khác là sử dụng describeType từ gói flash.utils. Với describeType bạn có thể lặp qua các thuộc tính của một đối tượng.

Dưới đây là ví dụ về cách sử dụng describeType để kiểm tra các thuộc tính của đối tượng là một phần của utils lib Tôi đã viết.

Đối với việc kiểm tra các loại tài sản, bạn có thể sử dụng describeType hoặc bạn cũng có thể sử dụng toán tử is như thế này:

if(myObj is SomeClass) 
{ 

} 

if(myObj is OtherClass) 
{ 

} 
+1

Tôi nghĩ rằng tôi sẽ phải làm đề nghị đầu tiên của bạn, mặc dù điều này có vấn đề nếu tôi thêm các biến mới vào các lớp học của tôi, tôi sẽ phải thêm dòng mới để nhân bản() mỗi lần. –

+3

Điều đó cũng có lợi thế. Có lẽ bạn có thể muốn đặt một giá trị mặc định nếu không có giá trị nào được đặt hoặc bạn có thể muốn sao chép một số đạo cụ và không phải là một số giá trị khác. Một cách tiếp cận tự động bằng cách sử dụng describeType sẽ không quá linh hoạt. – JeremyFromEarth

4

Để chạy qua tất cả các thuộc tính của một đối tượng con tàu và giao cho một thứ hai:

shipobj1:Ship = new Ship(); 
//set values for all shipobj1 properties 

shipobj2:Ship = new Ship(); 

for (item in shipobj2) 
    item = shipobj1[item]; 

Kiểm tra nếu giá trị tài sản là một đối tượng bạn có thể sử dụng typeof. Giới hạn của điều này là chỉ có 6 kiểu có thể trả về: boolean, function, number, object, string và xml. Vì vậy, ví dụ nếu bạn cần biết nếu một thuộc tính là một mảng, bạn không thể thực sự làm điều đó với typeof vì nó thực sự sẽ trả về "đối tượng" vì "mảng" không phải là một trong 6 tùy chọn, nhưng nếu bạn chỉ liên quan đến việc xác định loại đơn giản như số và chuỗi so với những thứ khác, nó nên làm các trick:

if(typeof item == "object") 
    // do whatever with object 
else if(typeof item == "string") 
    // do whatever with string 
//etc, etc. 

EDIT: Thay thế biến "var" với "mặt hàng" từ var là một từ dành riêng.

+0

Bạn có thể sử dụng là từ khóa cho phù hợp chặt chẽ hơn. ví dụ. if (something is Array) – Marty

+0

Tôi nhận được một số lỗi cú pháp với 'for (var in shipobj2) var = shipobj1 [var]; ' –

+0

Đó có thể là do" var "là từ dành riêng hoặc vì bạn gọi nó là obj2 cho câu lệnh và obj1 trong vòng lặp. – JeremyFromEarth

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