2009-10-26 30 views
10

Tôi có một lớp A và viết một lớp con B. A chỉ có một hàm tạo được tham số hóa. B phải gọi nhà xây dựng siêu này là A. Bây giờ tôi muốn sử dụng một đối tượng làm tham số. Đối tượng này nên gọi phương thức B. Vì vậy, đối tượng tham số phải giữ một tham chiếu của B hoặc phải là một lớp bên trong.Đề cập đến "this" trong khi gọi super constructor?

public B(){ 
    super.(new parameter(this)) 
} 

Bây giờ khi tôi muốn gọi các nhà xây dựng như ... Eclipse nói:

Không thể tham khảo 'này' cũng không 'siêu' trong khi gọi một cách rõ ràng một constructor

Các điều duy nhất tôi thấy để giải quyết vấn đề này, là một phương thức thiết lập, để tiêm "this" -instance vào đối tượng tham số. Tôi không muốn chỉnh sửa siêu hạng.

Bạn có thấy cách nào tốt hơn về điều này không.

+0

Bạn đang nói về ngôn ngữ * nào? –

+11

xem thẻ Jonathan ... java của nó – craftsman

Trả lời

17

Trình biên dịch thực sự ngăn bạn chụp chính mình ở chân đây. B không được xây dựng đầy đủ cho đến sau khi gọi hàm khởi tạo siêu, vì vậy nếu bạn vượt qua điều này (nếu trình biên dịch cho phép nó) làm tham chiếu, và nó gọi phương thức trên B, B sẽ ở trạng thái không hợp lệ và gây ra tất cả các loại các vấn đề khó chịu (trên thực tế, A vẫn chưa được khởi tạo, cũng không phải bất kỳ lớp nào trong chuỗi, bao gồm cả Object).

Giải pháp hiển nhiên là cung cấp chức năng bên ngoài B và chuyển cho hàm khởi tạo của tham số. Các giải pháp cụ thể sẽ phụ thuộc vào vấn đề cụ thể, nhưng một lớp lồng nhau tĩnh bên trong B (nó cần phải tĩnh vì lý do tương tự - một lớp bên trong có một tham chiếu ngầm định tới cá thể lớp bên ngoài) có thể cung cấp chức năng đó. Có lẽ bạn cần phải suy nghĩ lại mối quan hệ giữa tham số, B và lớp siêu của nó. Tất cả phụ thuộc vào vụ án.

+0

Tôi biết cách giải quyết nó. Vấn đề thực sự là, lớp siêu là mã "cũ". Tôi đang sử dụng lại nó trong một ngữ cảnh khác đôi chút. Tôi đã tìm kiếm một giải pháp thanh lịch. Nhưng tôi nghĩ không có. Giá là sử dụng lại mã cũ. –

+2

Bạn chỉ có thể soạn nó ra, đặt lớp mới như một wrapper quanh cái cũ. Lớp cũ có triển khai giao diện mà bạn có thể triển khai với đối tượng mới của mình không? – Joe

+1

@ c0d3x, bạn có thể đăng giải pháp của mình (trong một câu hỏi riêng) và hỏi xem có giải pháp thanh lịch hơn hay không. Thấy giải pháp của bạn sẽ trả lời rất nhiều câu hỏi về trường hợp cụ thể có liên quan. – Yishai

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