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

如果可能,请使用组合。这是 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
}
于 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 回答