簡體   English   中英

隱藏超類的方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM