[英]Hiding methods of superclass
我已經閱讀了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
。 但兩人都覺得難看。
話雖如此,有沒有更好的方法來隱藏超類的方法?
如果可能,請使用合成。 這是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
}
不知道我知道的。
這是一個OOP問題/功能。 你的類仍然是一個JTextArea,因此它可以被不知道你的子類的代碼使用,它將它視為JTextArea,期望JTextArea中的所有方法都在那里並正常工作。
如果需要定義新接口,則應定義一個不擴展JTextArea的新類,而是封裝它。
是的,使用代理而不是擴展 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.