我想强制子类实现一个我母亲类的实现方法.
我看这个 Java – Force implementation of an implemented method,但我不能把我的母亲类转换成抽象类.
我看这个 Java – Force implementation of an implemented method,但我不能把我的母亲类转换成抽象类.
- public class myMotherClass {
- myMethod {
- ...some code ..
- }
- }
- public class myClass extends myMotherClass {
- myMethod {
- ... other code ...
- }
- }
所以,在这个例子中,我想强制myClass实现myMethod.
对不起我的英语不好…
解决方法
你不能强制一个子类覆盖一个方法.你只能强制它通过抽象来实现一个方法.
所以如果你不能使myMotherClass抽象,你只能引入另一个超类扩展myMotherClass并委托给必须实现的方法:
- public abstract class EnforceImplementation extends myMotherClass {
- public final void myMethod(){
- implementMyMethod();
- }
- public abstract void implementMyMethod();
- }
编辑
我发现在hemcrest
api中解决问题的另一种整合方式是例如.由mockito使用
- public interface Matcher<T> extends SelfDescribing {
- /**
- * Evaluates the matcher for argument <var>item</var>.
- * <p/>
- * This method matches against Object,instead of the generic type T. This is
- * because the caller of the Matcher does not know at runtime what the type is
- * (because of type erasure with Java generics). It is down to the implementations
- * to check the correct type.
- *
- * @param item the object against which the matcher is evaluated.
- * @return <code>true</code> if <var>item</var> matches,otherwise <code>false</code>.
- *
- * @see BaseMatcher
- */
- boolean matches(Object item);
- /**
- * This method simply acts a friendly reminder not to implement Matcher directly and
- * instead extend BaseMatcher. It's easy to ignore JavaDoc,but a bit harder to ignore
- * compile errors .
- *
- * @see Matcher for reasons why.
- * @see BaseMatcher
- */
- void _dont_implement_Matcher___instead_extend_BaseMatcher_();
- }
该接口指定一个方法_dont_implement_Matcher___instead_extend_BaseMatcher_.当然这并不妨碍其他人实现Matcher界面,但它会指导开发人员正确的方向.
而BaseMatcher
类实现_dont_implement_Matcher___instead_extend_BaseMatcher_方法为final
- public final void _dont_implement_Matcher___instead_extend_BaseMatcher_() {
- // See Matcher interface for an explanation of this method.
- }
最后我认为这是一个设计问题,因为BaseMatcher可以实现每个Matcher
应该实现的逻辑.因此,使Matcher
成为一个抽象类并使用模板方法是更好的办法.
但是我猜他们是这样做的,因为它是字节码兼容性和新功能之间最好的妥协.