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
