Ни один из известных мне языков не заставляет вызывать переопределенный метод. Действительно, некоторые языки допускают переопределение методов, которые не могут быть переопределены (например, использование newключевого слова в C #). Однако есть два способа приблизиться к этому.
Первый - создать не переопределяемый метод (например, метод, в котором отсутствует virtualключевое слово в C # или метод , содержащий finalключевое слово в Java), который вызывает переопределяемый метод, который нельзя вызвать извне класса (например, protectedв C #, Java или C ++).
class C
A
statement1
F
statement3
protected virtual F
statement2
и
class D inherits C
protected override F
statement4
C.F()
Переопределение классов Cможет свободно переопределять Fи изменять его поведение, но вызывающие извне класса только получают к нему доступ A.
Редактировать: Как уже отмечали другие, это называется шаблоном метода Template .
Второй способ - использовать язык, который обеспечивает предварительные условия и постусловия, указанные в базовом классе, такие как Eiffel или C # с кодовыми контрактами. Это не заставит вызывать базовый класс, но переопределенный метод может быть вынужден выполнять те же операторы. Использование аспектов может также помочь, если язык позволяет аспектам наследоваться.