2009-02-18 32 views
6

Tất cả các đối tượng trong actionscript3.0 kế thừa từ lớp Object, nhưng trình biên dịch actionscript3.0 có vẻ không đủ thông minh để hiểu điều này.Tại sao hành vi thừa kế lớp actionscript3.0 không thành công (đôi khi)?

hãy nhìn vào đoạn mã sau:

package{ 
    public class TestOne{ 
     public function TestOne(){ 
     var t2: TestTwo = new TestTwo(); 
     trace(t2.toString()); // COMPILE TIME ERROR 
     trace((t2 as Object).toString(); // [object TestTwo] 

     var t22 : * = new TestTwo(); 
     trace(t22.toString()); // [object TestTwo] 
     trace((t22 as Object).toString(); // [object TestTwo] 
     } 
    } 
} 
class TestTwo{} 

t2.toString() đưa ra một lỗi thời gian biên dịch vì kiểu dữ liệu t2 không bao gồm toString(). Tuy nhiên, t2 không bao gồm toString() vì nó là một đối tượng là (t2 là đối tượng) .toString() hiển thị. Nếu chúng ta không cung cấp cho biến một kiểu dữ liệu, như t22, thì vấn đề không bao giờ gặp phải. Tại sao trình biên dịch actionscript3.0 không thể giải thích rằng t2 là cả TestTwo và Object?

+0

Ý của bạn là cho các dòng 9 và 10 để tìm ra biến "t22" thay vì "t2"? – aaaidan

+0

Có một số lỗi chính tả trong ví dụ của bạn, nhưng câu hỏi thực sự thú vị ... –

Trả lời

4

Điều này là do

Các phương thức của lớp Object là động tạo ra trên nguyên mẫu Object của. Để xác định lại phương thức này trong một phân lớp của đối tượng, không sử dụng từ khóa ghi đè . Ví dụ: một lớp con của hàm Thực hiện đối tượng toString(): Chuỗi thay vì sử dụng ghi đè của lớp cơ sở.

Vì vậy, nếu bạn truyền TestTwo cho một đối tượng, trình biên dịch sẽ biết các phương pháp đó sẽ được triển khai. Nếu bạn không truyền nó, TestTwo không kế thừa các phương thức đó và do đó chúng chưa được triển khai và sẽ bị lỗi.

Đó là một chút kỳ lạ!

+0

Chính xác, nó là sau kế thừa cho chữ cái, và toString không phải là một phương thức lớp được thừa kế, nó trên đối tượng nguyên mẫu. AS3 thực hiện theo kế thừa lớp VERY nghiêm chỉnh, vì vậy nếu bạn tìm thấy một tình huống mà bạn nghĩ rằng nó không, rất có thể là bạn đang thiếu một cái gì đó, không phải trình biên dịch! –

0

Thừa kế lớpthừa kế nguyên mẫu là hai thứ khác nhau trong AS3. Sự thừa kế nguyên mẫu theo như tôi hiểu được cho khả năng tương thích ngược với AS2/AS1 và thừa kế nguyên mẫu của nó, cung cấp phương thức toString() trên biến được đưa vào lớp Object trong ví dụ của bạn. Nguyên mẫu đối tượng có phương thức toString(), không phải đối tượng lớp. Vì nguyên mẫu không có trong lớp TestTwo của bạn, nên nó không có phương thức toString(). Nếu phương thức toString() được cung cấp thông qua kế thừa lớp, thay vào đó, ví dụ của bạn sẽ biên dịch. Vì vậy, về mặt kỹ thuật, câu lệnh của bạn "Tất cả các đối tượng trong actionscript3.0 kế thừa từ lớp Object" là không hoàn toàn chính xác, vì sự khác biệt giữa thừa kế nguyên mẫu và thừa kế lớp. Sự thừa kế nguyên mẫu là một khái niệm OO hơi bí truyền được tìm thấy trong các ngôn ngữ kịch bản lệnh.

Có ai biết lý do AS3 được thiết kế như thế này không?

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