2011-09-24 29 views
5

Tôi luôn không gọi super() khi tôi mở rộng Sprite.
Nhưng không not calling super() gây ra bất kỳ sự cố nào?

Cho đến bây giờ, tôi không gặp bất kỳ sự cố nào và tôi chưa bao giờ thấy mã gọi super() trong hàm tạo lớp mở rộng Sprite.

Làm thế nào về TextField?
Tôi cũng không gặp bất kỳ vấn đề nào về TextField.

Làm cách nào để biết liệu tôi có nên gọi super() hay không?Tôi có phải gọi super() trong hàm dựng khi lớp mở rộng Sprite trong actionscript3 không?

Trả lời

28

Nếu đèn flash không phát hiện một cuộc gọi đến super() trong constructor con của bạn sau đó flash sẽ ngầm gọi super()trước constructor của con quý vị. Vì vậy:

public class Parent { 
    public function Parent() { 
     trace("Parent"); 
    } 
} 

public class Child extends Parent { 
    public function Child() { 
     trace("Child"); 
    } 
} 

new Child(); 
// Parent 
// Child 

Vì vậy, xây dựng con bạn về cơ bản trông như thế này

public function Child() { 
     super(); // <-- Added by flash! 
     trace("Child"); 
    } 

Vì vậy, không, bỏ qua một cuộc gọi rõ ràng để super() sẽ không thường ảnh hưởng xấu đến lớp của con quý vị.

Vậy tại sao bạn muốn gọi rõ ràng super()? Lý do đầu tiên là flash sẽ chỉ tự động tạo ra một cuộc gọi không tham số đến super, có nghĩa là nếu các lớp cha của bạn constructor yêu cầu đối số, thì bạn sẽ cần gọi nó một cách rõ ràng với các đối số đó. Nếu bạn bỏ qua cuộc gọi super(args...) trong trường hợp này, bạn sẽ gặp lỗi trình biên dịch.

Thứ hai, nếu ngay cả bố mẹ bạn có hàm tạo ít tham số, bạn có thể sử dụng super() để kiểm soát thứ tự mà các nhà thầu thực thi. Flash sẽ luôn chèn cuộc gọi trước hàm tạo con. Vì vậy, nếu bạn muốn thay đổi thứ tự đó. Sau đó,

public class Child extends Parent { 
    public function Child() { 
     trace("Child"); 
     super() 
    } 
} 

sẽ thực hiện theo thứ tự ngược lại. Hoặc bạn có thể làm:

public class Child extends Parent { 
    public function Child() { 
     // work before initilizing parent 
     super() 
     // work after initilizing parent 
    } 
} 

Cuối cùng, có một cách rất mơ hồ để không gọi constructor cha mẹ của bạn bằng cách nói:

public class Child extends Parent { 
    public function Child() { 
     if(false) super() 
    } 
} 

Bởi vì đèn flash thấy có một cuộc gọi, nó không chèn một. Tuy nhiên, vì nó phía sau một if (false) nó không bao giờ được gọi, do đó, lớp cha mẹ không bao giờ được khởi tạo.

+0

Cám ơn một câu trả lời tuyệt vời! Làm thế nào bạn biết rằng chức năng bí mật (Tự động siêu chèn)? –

+4

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f30.html - Trong phần được gọi là ** Phương thức xây dựng ** –

+1

Không áp đặt hàm tạo mẹ có nghĩa là không có trình xây dựng tổ tiên nào được gọi hoặc chỉ siêu lớp ngay lập tức? –

1

Bạn có thể loại trừ an toàn cuộc gọi đến hàm tạo cơ bản. Nếu bạn không gọi super() trong hàm tạo, trình biên dịch sẽ thêm một cuộc gọi đến hàm tạo cơ sở mà không có đối số.

4

Nếu bạn không gọi super() một cách rõ ràng, Flash sẽ tự động làm trước tất cả mã khác trong hàm tạo của bạn.

Nếu bạn gọi super() một cách rõ ràng, nó sẽ được gọi tại dòng mà bạn đã viết.

Tuy nhiên, lưu ý rằng bạn không thể thiết lập hoặc nhận được bất kỳ this hoặc super tài sản hoặc gọi bất kỳ phương pháp trước lớp siêu là instantiated

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