【问题标题】:Hiding methods of superclass隐藏超类的方法
【发布时间】:2011-11-17 05:24:49
【问题描述】:

我已阅读 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,我可以让身体空着。但两人都觉得丑。

话虽如此,有没有更好的方法来隐藏超类的方法?

【问题讨论】:

  • 只是为了强调(@Simone 有完整的答案):您不得在不履行合同的情况下覆盖超类的方法。顺便说一句,您引用的句子是关于 class 方法,而您在此处覆盖 instance 方法。
  • @kleopatra,我标记了我所做的答案,因为我觉得这个问题不会引起更多关注。我仍然觉得这个问题没有得到充分的回答。也许你可以提供一个你自己的?看来你知识渊博! :D
  • 我知道这个问题很老了,但我刚刚发现了这个......我通常用你的方式来做这件事,我也做的一件事是将方法重写为 final 以便类可以' t 被扩展以启用某些功能作为附加。

标签: java swing method-hiding


【解决方案1】:

如果可能,请使用组合。这是 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,我很欣赏这个建议,尽管这并不是很理想。这是有道理的,但是我将无法将JWrappedLabel 实例直接添加到容器中。相反,我必须查询对象的文本区域,我真的不想这样做。但如果组合是唯一的其他选择,我宁愿抛出异常。无论哪种方式,看起来最终的解决方案都会相当难看。 ://
  • 我唯一要添加的是实现一个允许您将 JWrappedLabel 添加到容器的接口。这将解决 mrkhrts 上面提到的问题。
【解决方案2】:

没有,据我所知。

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

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

【讨论】:

    【解决方案3】:

    是的,使用delegate rather than extending

    【讨论】:

      猜你喜欢
      • 2017-07-22
      • 2011-05-04
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多