8

メソッドのオーバーライドと非表示のチュートリアルを読みました。そしてそれから、私は以下を集めました:

サブクラスがスーパークラスのクラスメソッドと同じシグネチャを持つクラスメソッドを定義する場合、サブクラスのメソッドはスーパークラスのメソッドを非表示にします。

そのため、私は次のことを行いました。

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、私は体を空のままにしておくことができました。しかし、どちらも醜い感じがします。

そうは言っても、スーパークラスのメソッドを隠すためのより良いアプローチはありますか?

4

3 に答える 3

11

可能であれば、構成を使用してください。これは、Effective Java、 SecondEditionのJoshuaBlochによって推奨されています。

項目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
}
于 2011-09-14T17:16:11.953 に答える
3

いいえ、私は知っています。

これはOOPの問題/機能です。あなたのクラスはまだJTextAreaであるため、JTextAreaのすべてのメソッドが存在し、正しく機能することを期待して、JTextAreaとして扱うサブクラスを認識しないコードで使用される可能性があります。

新しいインターフェースを定義する必要がある場合は、JTextAreaを拡張するのではなく、カプセル化する新しいクラスを定義する必要があります。

于 2011-09-14T17:12:08.683 に答える
1

はい、拡張するのではなく、デリゲートを使用してください。

于 2011-09-14T17:11:46.320 に答える