【问题标题】:Override interface instead of parent class in Java覆盖接口而不是Java中的父类
【发布时间】:2016-11-17 14:33:15
【问题描述】:

我有一个类扩展了另一个类 (ReloadableResourceBundleMessageSource) 并且还实现了一个接口 (myMessageProvider),如下所示:

public class CustomMessageSource extends ReloadableResourceBundleMessageSource implements myMessageProvider{

    @Override
    public String getMessage(String code, Object[] objects, final Locale locale{
        try {
            return getMessage(code, objects, locale);
        } catch (NoSuchMessageException e) {
            return code;
        }
    }
}

接口和父类都有getMessage 函数,但我只想覆盖接口之一。目前此代码给出编译错误,因为父类 (ReloadableResourceBundleMessageSource) 中的 getMessage 是 final

【问题讨论】:

  • 它们是否采用相同的参数?顺便说一句,您在这里缺少“)”public String getMessage(String code, Object[] objects, final Locale locale{
  • @XtremeBaumer,是的,参数相同。
  • 他们也应该这样做吗?
  • 不,我必须重写它,这样它就不会抛出 NoSuchMessageException 异常。
  • 创建一个只实现myMessageProvider的不同类,然后使用它并扩展ReloadableResourceBundleMessageSource

标签: java inheritance overriding


【解决方案1】:

如果您覆盖不是finalgetMessageInternal() 方法,并且 getMessage() 方法调用,您可以通过不返回空值来影响结果。您无需在代码中更改对 getMessage() 方法的任何调用,因为它们会自己调用内部方法。

@Override
public String getMessageInternal(String code, Object[] objects, final Locale locale) {
        String foo = super.getMessageInternal(code, objects, locale);

        return foo == null ? code : foo;
    }
}

【讨论】:

  • 现在我明白了你的想法,这很好!唯一的问题是因为getMessage在父类中被调用,子类覆盖不影响父类调用。
  • @Arashsoft 你到底在说什么。如果你有一个CustomMessageSource 的实例并且你在它上面调用getMessage(),那个方法被调用。
  • 如果我错了,请纠正我,如果我在 customeMessageSource 的实例上调用 getMessage。父类ReloadableResourceBundleMessageSourcegetMessage 处理请求。在该函数内部,它尝试调用getMessageInternal。这是ReloadableResourceBundleMessageSource 内部的一个内部调用。它不会调用它的子覆盖。 (也许我错了?)
  • 你错了。由于 getMessageInternal 方法是在您的实现中被覆盖的 protected 方法,因此调用实例的方法 (CustomMessageSource)。您可以通过创建一个具有调用toString() 的方法的类来自己测试它,扩展它以提供toString() 的不同实现并调用原始方法。您会注意到调用了覆盖实现。
  • 它奏效了,解决方案非常有创意! :) 非常感谢。
猜你喜欢
  • 2017-10-21
  • 1970-01-01
  • 2015-10-31
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2014-07-17
相关资源
最近更新 更多