在Java中重写接口而不是父类
我有一个类扩展了另一个类(在Java中重写接口而不是父类,java,inheritance,overriding,Java,Inheritance,Overriding,我有一个类扩展了另一个类(ReloadableResourceBundleMessageSource),还实现了一个接口(myMessageProvider),如下所示: public class CustomMessageSource extends ReloadableResourceBundleMessageSource implements myMessageProvider{ @Override public String getMessage(String code
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
,,如果您重写getMessageInternal()
方法,该方法不是final
,由getMessage()
方法调用,您可以通过不返回null来影响结果。您不需要在代码中更改对getMessage()
方法的任何调用,因为它们将自己调用内部方法
@Override
public String getMessageInternal(String code, Object[] objects, final Locale locale) {
String foo = super.getMessageInternal(code, objects, locale);
return foo == null ? code : foo;
}
}
它们采用相同的参数吗?顺便说一句,这里缺少一个“)”
publicstringgetmessage(stringcode,Object[]objects,finallocale){
@XtremeBaumer,是的,是相同的参数。它们应该做相同的事情吗?不,我必须重写它,这样它就不会抛出NoSuchMessageException
异常。创建一个只实现myMessageProvider
的不同类,然后使用它并扩展可重新加载的ResourceBundleMessageSource
。现在我有了你的想法这很好!唯一的问题是getMessage在父类中被调用,子类重写不会影响父类调用。@Arashsoft你到底在说什么。如果你有一个CustomMessageSource
的实例,你调用getMessage()
在其上,将调用该方法。如果我对customeMessageSource
的实例调用getMessage
,请纠正我的错误。parrent类ReloadableSourceBundleMessageSource
的getMessageInternal
的getMessage>处理请求。在该函数内,它尝试调用getMessageInternal
。它是reloadableSourceBundleMessageSource
中的内部调用。它不会调用它的子重写。(可能我错了?)你错了。由于getMessageInternal
方法是一个受保护的
方法,在实现中被重写,因此实例的方法(CustomMessageSource)您可以通过创建一个类来测试它,该类有一个调用toString()
的方法,扩展它,提供不同的toString()
实现并调用原始方法。您会注意到重写实现被调用。它工作了,解决方案非常有创意!:)非常感谢。