隐藏超类的方法

时间:2011-09-14 17:07:45

标签: java swing method-hiding

我已阅读Overriding and Hiding Methods教程。从那以后,我收集了以下内容:

  

如果子类定义了具有与a相同签名的类方法   在超类中的类方法,子类中的方法隐藏   一个在超类中。

因此,我做了以下事情:

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,我可以把身体留空。但两人都觉得难看。

话虽这么说,有没有更好的方法来隐藏超类的方法?

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:3)

我不知道。

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

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

答案 2 :(得分:1)

是的,请使用delegate rather than extending