Java 超类的隐藏方法

Java 超类的隐藏方法,java,swing,method-hiding,Java,Swing,Method Hiding,我已经阅读了教程。由此,我得出以下结论: import javax.swing.JTextArea; public final class JWrappedLabel extends JTextArea{ private static final long serialVersionUID = -844167470113830283L; public JWrappedLabel(final String text){ super(text);

我已经阅读了教程。由此,我得出以下结论:

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();
    }
}
如果子类定义的类方法与 类中的方法,子类中的方法隐藏 超类中的一个

因此,我做了以下工作:

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
,我还可以将主体留空。但他们都觉得自己很丑

也就是说,有更好的方法隐藏超类的方法吗

是的,用一个。

不,据我所知

这是一个OOP问题/功能。您的类仍然是一个JTextArea,因此它可以被不知道您的子类的代码使用,而子类会将其视为一个JTextArea,希望JTextArea中的所有方法都在那里并正常工作


如果需要定义新接口,则应定义一个新类,该类不扩展JTextArea,而是封装它。

如果可能,请使用composition。这是Joshua Bloch在年提出的建议

第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
}

+1.我很感激你的建议,尽管这不是很理想。这是有道理的,但这样我就无法将
JWrappedLabel
实例直接添加到容器中。相反,我必须查询对象的文本区域,我真的不想这样做。但如果组合是唯一的选择,我宁愿抛出异常。不管怎样,看起来最终的解决方案都会相当难看/我唯一要添加的是实现一个接口,允许您将JWrappedLabel添加到容器中。这将解决mrkhrts上面提到的问题。只是强调一下(@Simone有完整的答案):在不履行其契约的情况下,您不能重写超类的方法。顺便说一句,你引用的这句话是关于类方法的,而你在这里重写了一个实例方法。@kleopatra,我标记了我的答案,因为我觉得这个问题不会引起更多的注意。我仍然觉得这个问题没有得到充分的回答。也许你可以自己提供一个?你似乎很有见识我知道这个问题很老,但我刚刚发现这个问题,所以。。。我通常使用您的方法来实现这一点,我还做的一件事是将方法重写为final,这样就不能扩展类来启用某些附加功能。