Sie nicht eine Unterklasse eine Methode zu überschreiben erzwingen. Sie können es nur zwingen, eine Methode zu implementieren, indem Sie sie abstrakt machen.
Also, wenn Sie nicht machen myMotherClass abstrakt können Sie nur eine andere übergeordnete Klasse einführen, die myMotherClass und Delegierten des Verfahrens erstreckt, die umgesetzt werden müssen:
public abstract class EnforceImplementation extends myMotherClass {
public final void myMethod(){
implementMyMethod();
}
public abstract void implementMyMethod();
}
EDIT
ich eine andere interessante Art und Weise gefunden zur Lösung des Problems in der hemcrest
API, die z verwendet von 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_();
}
Die Schnittstelle legt ein Verfahren _dont_implement_Matcher___instead_extend_BaseMatcher_
. Natürlich hindert es andere nicht daran, die Schnittstelle Matcher
zu implementieren, aber es führt den Entwickler in die richtige Richtung.
Und die BaseMatcher
Klasse implementiert die _dont_implement_Matcher___instead_extend_BaseMatcher_
Methode als final
public final void _dont_implement_Matcher___instead_extend_BaseMatcher_() {
// See Matcher interface for an explanation of this method.
}
Schließlich glaube ich, dass dies ein Design-Problem, weil die BaseMatcher
obviouosly implementiert Logik, die jedes Matcher
implementieren sollte. Daher wäre es besser gewesen, die Matcher
eine abstrakte Klasse zu erstellen und eine Template-Methode zu verwenden.
Aber ich denke, sie taten es, weil es der beste Kompromiss zwischen Bytecode-Kompatibilität und neuen Funktionen war.
Kurz gesagt: Sie können nicht, ohne es abstrakt zu machen –
@stonedsquirrel Was ist mit einer Schnittstelle? –
Dies ist nicht möglich mit Annotationen oder durch Auslösen einer Ausnahme, wenn die Klasse die Methode nicht implementiert? – Maniz