2011-09-14 152 views
8

我讀過Overriding and Hiding Methods教程。並從我收集的以下內容:超類的隱藏方法

如果子類定義具有相同簽名作爲超一 類方法類方法,在子類皮的方法的 一個超類。

因此,我做了以下內容:

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(); 
    } 
} 

我不喜歡這樣的設計是什麼append仍然是子類的可見方法。而不是拋出UnsupportedOperationException,我可以把身體留空。但都感到難看。

話雖這麼說,有沒有隱藏超類的方法更好的方法?

+2

只是強調(@Simone有完整的答案):你**絕不能**超類的覆蓋方法沒有履行合同。順便說一句,你引用的句子是關於_class_方法,而你在這裏覆蓋_instance_方法。 – kleopatra

+0

@kleopatra,我標記了我做的答案,因爲我覺得這個問題不會引起更多的關注。我仍然不覺得這個問題已經得到了充分的回答。也許你可以提供一個你自己的?你似乎是知識淵博的! :d – mrkhrts

+0

我知道這個問題是舊的,但我剛剛發現這個如此... 我通常使用的方式做到這一點,一兩件事,我也做的是重載方法爲final,這樣的類不能被擴展到啓用某些功能作爲追加功能。 –

回答

11

使用成分,如果可能的話。這是Joshua Bloch在Effective Java, Second Edition推薦的。

16項:在繼承青睞組成

例如:

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,我很欣賞這個建議,雖然這不是很理想。它是有道理的,但是我不能直接向容器中添加一個'JWrappedLabel'實例。相反,我將不得不查詢對象的文本區域,我真的不想這樣做。但如果組合是唯一的其他選擇,我寧願拋出異常。無論哪種方式,它看起來最終的解決方案將是相當醜陋的。 :/ – mrkhrts

+1

我要添加的唯一東西是實現一個接口,允許您將JWrappedLabel添加到容器。這將解決mrkhrts上面提到的問題。 –

+0

@James DW,我會研究一下,謝謝! :d – mrkhrts

3

都能跟得上,我知道的。

這是一個面向對象的問題/功能。你的類仍然是一個JTextArea,因此它可以被不知道你的子類的代碼使用,它會把它當作一個JTextArea,期待JTextArea中的所有方法都在那裏並且正常工作。

如果您需要定義一個新的接口,你應該定義一個新的類不延長的JTextArea而是它封裝。