2011-09-14 35 views
8

Tôi đã đọc hướng dẫn Overriding and Hiding Methods. Và từ đó, tôi thu thập được như sau:Cách ẩn của siêu lớp

Nếu một lớp con định nghĩa một phương thức lớp với chữ ký giống như một phương pháp lớp trong lớp cha, phương pháp trong subclass da các ai trong lớp cha.

Như vậy, tôi đã làm như sau:

import javax.swing.JTextArea; 

public final class JWrappedLabel extends JTextArea{ 
    private static final long serialVersionUID = -844167470113830283L; 

    public JWrappedLabel(final String text){ 
     super(text); 
     setOpaque(false); 
     setEditable(false); 
     setLineWrap(true); 
     setWrapStyleWord(true); 
    } 

    @Override 
    public void append(final String s){ 
     throw new UnsupportedOperationException(); 
    } 
} 

Những gì tôi không thích về thiết kế này là append vẫn là một thể nhìn thấy phương pháp của lớp con. Thay vì ném UnsupportedOperationException, tôi có thể đã để trống cơ thể. Nhưng cả hai đều cảm thấy xấu xí.

Điều đó đang được nói, có cách nào tốt hơn để ẩn các phương thức của lớp bậc trên không?

+2

chỉ để nhấn mạnh (@Simone có câu trả lời đầy đủ): bạn ** phải không ** phương pháp ghi đè của một lớp cha mà không hoàn thành hợp đồng. BTW, câu bạn trích dẫn là về các phương thức _class_ trong khi bạn ghi đè phương thức _instance_ tại đây. – kleopatra

+0

@kleopatra, tôi đánh dấu câu trả lời tôi đã làm bởi vì tôi cảm thấy rằng câu hỏi này sẽ không thu hút thêm sự chú ý nào nữa. Tôi vẫn không cảm thấy rằng câu hỏi này đã được trả lời đầy đủ. Có lẽ bạn có thể cung cấp một của riêng bạn? Bạn dường như có kiến ​​thức! : D – mrkhrts

+0

tôi biết câu hỏi đó là cũ nhưng tôi chỉ tìm thấy điều này vì vậy ... Tôi thường sử dụng cách của bạn để làm điều này, một điều mà tôi cũng làm là ghi đè lên các phương thức như là cuối cùng để lớp không thể được mở rộng đến bật một số tính năng nhất định như nối thêm. –

Trả lời

11

Sử dụng bố cục, nếu có thể. Điều này được đề xuất bởi Joshua Bloch trong Effective Java, Second Edition.

mục 16: Thành phần Favor qua thừa kế

Ví dụ:

import javax.swing.JTextArea; 

public final class JWrappedLabel { 
    private static final long serialVersionUID = -844167470113830283L; 

    private final JTextArea textArea; 

    public JWrappedLabel(final String text){ 
     textArea = new JTextArea(text); 
     textArea.setOpaque(false); 
     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 
    } 

    //add methods which delegate calls to the textArea 
} 
+0

+1, tôi đánh giá cao đề xuất, mặc dù điều này không thực sự mong muốn. Nó có ý nghĩa, nhưng sau đó tôi sẽ không thể thêm một cá thể 'JWrappedLabel' trực tiếp vào một vùng chứa. Thay vào đó, tôi sẽ phải truy vấn đối tượng cho vùng văn bản của nó, điều mà tôi thực sự không muốn làm. Nhưng nếu thành phần là lựa chọn thay thế duy nhất khác, tôi muốn ném ngoại lệ. Dù bằng cách nào, có vẻ như giải pháp cuối cùng sẽ khá xấu xí. :/ – mrkhrts

+1

Điều duy nhất tôi muốn thêm là triển khai giao diện cho phép bạn thêm JWrappedLabel vào vùng chứa. Điều đó sẽ giải quyết vấn đề mrkhrts đã lưu ý ở trên. –

+0

@ James DW, tôi sẽ xem xét điều đó, cảm ơn! : D – mrkhrts

3

Không biết rằng tôi biết.

Đây là vấn đề/tính năng OOP. Bạn lớp vẫn là một JTextArea, và như vậy nó có thể được sử dụng bởi mã không biết của bạn phân lớp mà sẽ đối xử với nó như là một JTextArea, mong đợi tất cả các phương pháp trong JTextArea là có và làm việc đúng cách.

Nếu bạn cần xác định giao diện mới, bạn nên xác định một lớp mới không mở rộng JTextArea mà thay vào đó đóng gói nó.

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