Java – how to enforce a method in a subclass without using abstraction?
I want to force subclasses to implement an implementation method of my mother class
public class myMotherClass { myMethod { ...some code .. } } public class myClass extends myMotherClass { myMethod { ... other code ... } }
So, in this example, I want to force MyClass to implement mymethod
Sorry, my English is not good
Solution
You cannot force a subclass to override a method You can only force it to implement a method through abstraction
So if you can't abstract mymotherclass, you can only introduce another superclass to extend mymotherclass and delegate it to the methods that must be implemented:
public abstract class EnforceImplementation extends myMotherClass { public final void myMethod(){ implementMyMethod(); } public abstract void implementMyMethod(); }
edit
I've found that another integration approach to solving problems in the hemrest API is, for example Used by 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_(); }
This interface specifies a method_ dont_ implement_ Matcher___ instead_ extend_ BaseMatcher_. Of course, this does not prevent others from implementing the matcher interface, but it will guide developers in the right direction
The basematcher class implements_ dont_ implement_ Matcher___ instead_ extend_ BaseMatcher_ The method is final
public final void _dont_implement_Matcher___instead_extend_BaseMatcher_() { // See Matcher interface for an explanation of this method. }
Finally, I think this is a design problem, because basematcher can implement the logic that each matcher should implement Therefore, it is better to make matcher an abstract class and use template method
But I guess they do, because it's the best compromise between bytecode compatibility and new features