2010-01-27 32 views
12

Tôi biết rằng trong Java chúng ta không thể mở rộng một lớp cuối cùng. Nhưng liệu có cách nào khác để tôi có được hiệu quả của việc mở rộng một lớp học cuối cùng?Tương đương với việc mở rộng một lớp cuối cùng trong Java

Bởi vì tôi có một lớp học cuối cùng với các yêu cầu tôi đang tìm kiếm, vì vậy nếu bằng cách nào đó tôi có thể sử dụng lại điều này, nó sẽ giúp ích rất nhiều cho tôi.

Trả lời

27

Tạo trình bao bọc cho lớp học cuối cùng?

Something như thế này:

class MyClass { 
    private FinalClass finalClass; 

    public MyClass { 
     finalClass = new FinalClass(): 
    } 

    public void delegatingMethod() { 
     finalClass.delegatingMethod(); 
    } 
} 

Một lớp wrapper như MyClass sẽ không được chấp nhận như là một thể hiện của FinalClass. Nếu FinalClass triển khai bất kỳ giao diện nào bạn có thể triển khai chúng trong MyClass để làm cho các lớp giống nhau hơn. Điều này cũng đúng với bất kỳ phụ huynh không phải là cha mẹ cuối cùng của số FinalClass; trong trường hợp đó, thiết kế MyClass của bạn phải tương thích với các lớp cha đó.

Thậm chí có thể tạo lớp trình bao bọc trong thời gian chạy bằng phản xạ. Trong trường hợp đó, bạn có thể sử dụng Proxy class. Hãy coi chừng các lớp proxy yêu cầu kiến ​​thức chuyên sâu về hệ thống kiểu Java.

+1

Trong thực tế, mặc dù điều này chỉ hoạt động nếu lớp được gói thực hiện một số loại giao diện/lớp trừu tượng và bạn có thể cung cấp một trường hợp bao bọc thay cho bản gốc. Nếu bạn không thể thực hiện một trong hai điều này thì việc này khó thực hiện với việc tái cấu trúc lại bản gốc. –

+0

Tất nhiên bạn không thể thay thế tất cả các phiên bản của FinalClass bằng MyClass. Nhưng bạn có thể định nghĩa giao diện của riêng bạn để bọc FinalClass với MyClass. Chỉ cần không bao giờ tham khảo FinalClass bên ngoài MyClass. – Arne

+0

@ArneJan, bạn có nghĩa là tôi không nên tham khảo trường 'finalClass' trong bất kỳ lớp nào khác không? Tại sao? –

3

Tùy chọn đơn giản nhất là viết trình bao bọc, chứa một thể hiện của lớp cuối cùng dưới dạng biến thành viên và hoạt động như một proxy cho lớp cuối cùng.

Bằng cách này, thật dễ dàng để ghi đè hoặc mở rộng các phương pháp của lớp học cuối cùng.

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