Редактировать
Невозможно одновременно удовлетворить все требования, конец истории. Вы должны отказаться хотя бы от одного условия и, возможно, рассмотреть совершенно другой подход к проблеме, которую вы пытаетесь решить.
Используйте два отдельных метода. Или:
abstract class Foo {
// Override this method
abstract void doActionInSubclass();
// You can't override a final method
// And you don't want subclases to override this one
final void doAction () {
// do whatever default-y things you want here
doActionInSubclass();
}
}
Или просто выделите «требуемый» метод полностью отдельно от того, который вы хотите переопределить подклассами:
abstract class Foo {
abstract void mustOverrideThisInConcreteSubclasses();
final void doAction() {
// default-y things here
}
}