Skip to main content

Что такое метод переопределения?

Переопределение метода используется в объектно-ориентированном программировании в иерархии наследования и происходит, когда метод, определенный в суперклассе, переопределяется в подклассе. Обычно метод подкласса делает что-то отличное от метода суперкласса или расширяет возможности суперкласса, но это не должно иметь место. Переопределение метода происходит всякий раз, когда метод суперкласса переопределяется в подклассе, независимо от содержимого переопределенного метода. Переопределенные сигнатуры методов должны быть точно такими же.

Например, класс A может содержать метод с именем «doSomething», и этот метод не принимает входных параметров. Кроме того, классы B и C могут быть подклассами класса A. Класс B может содержать метод с именем "doSomething", который не принимает входных параметров, а класс C может содержать метод "doSomething", который принимает число в качестве входного параметра. В этом примере только класс B продемонстрировал бы переопределение метода, потому что его метод "doSomething" имеет ту же сигнатуру метода, что и его суперкласс, класс A. Метод "doSomething" в классе C, с другой стороны, демонстрирует перегрузку метода, потому что он создает совершенно новый метод.

Виртуальное наследование в C ++ является еще одним примером переопределения метода. Виртуальные методы в суперклассах могут быть или не быть реализованы, но любое их определение подкласса является экземпляром переопределения метода. Когда метод переопределяется в подклассе, метод суперкласса не вызывается, если он не вызывается явно. Этот конкретный способ вызова переопределенного метода часто называют «скрывающим» реализацию суперкласса.

Хотя переопределение методов очень гибкое, не все методы могут быть переопределены, и бывают моменты, когда эта жесткость может быть предпочтительнее. Как в Java, так и в C ++ конкретные сигнатуры могут применяться в сигнатурах методов, чтобы предотвратить переопределение метода в подклассе. Для этого Java использует ключевое слово final, а C ++ использует ключевое слово const. Предотвращение переопределения метода может быть полезным, если конкретная функция всегда должна оставаться неизменной по всему дереву наследования.

В общем, простые методы, которые получают небольшие фрагменты данных, не должны быть переопределены. Случаи, которые имеют наибольшую выгоду от переопределения, это когда подкласс стремится добавить функциональность в метод суперкласса, не создавая совершенно новый метод для этого. Необычные случаи, когда метод должен быть полностью переделан для одного конкретного типа объекта, также могут выиграть от этой техники. Всякий раз, когда метод переопределяется, для программиста важно адекватно комментировать методы суперкласса и подкласса. В идеале эти комментарии должны прояснить, что делает каждый вариант метода, а также как и почему они отличаются.