Когда я должен переопределять методы суперкласса в подклассе? Должны ли переопределяться все методы суперкласса, если нет дополнительных функций?

#java

#java

Вопрос:

У меня есть суперкласс и подклассы, которые наследуют суперкласс. Суперкласс содержит 6 методов, но мои подклассы имеют другую реализацию только 1 из методов суперкласса, который необходимо переопределить. Должен ли я по-прежнему переопределять оставшиеся 5 методов в подклассе, выполнив, т.е.;

 @Override
public void someMethod(String someString) {
    super.someMethod(someString);
}
  

Я чувствую, что это излишне, но при вызове someMethod в подклассе, будет ли он выполнять методы суперкласса, если он не переопределен, или будет ошибка? Я не уверен, что это хорошая практика программирования, поскольку я новичок в Java.

Комментарии:

1. переопределите то, что вы должны, унаследуйте то, что можете.

2. Это зависит от типа суперкласса, если это Abstract класс, вы должны переопределить все свои методы. Для конкретного класса вам нужно переопределить только то, что требуется. И это основа OOPs того, что методы вашего суперкласса могут использоваться подклассом.

3. @darshgohel, если это абстрактный класс, вы должны переопределить все свои методы , на самом деле, вы должны переопределить только те методы, которые не имеют реализации.

Ответ №1:

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

при вызове someMethod в подклассе, будет ли он выполнять методы суперкласса, если он не переопределен, или будет ошибка?

Да, это будет. Ошибка не будет выдана, если вызываемый вами метод не виден подклассам.

Комментарии:

1. Я не согласен, что наследование является хорошей практикой для повторного использования кода. en.wikipedia.org/wiki/Composition_over_inheritance

2. @Andronicus, мы здесь не выбираем между композицией и наследованием. У обоих методов есть преимущества и недостатки. Наследование может помочь избежать повторения кода, и в этом суть.

Ответ №2:

Согласно официальной документации Oracle,

Способность подкласса переопределять метод позволяет классу наследовать от суперкласса, поведение которого «достаточно близко», а затем изменять поведение по мере необходимости. Переопределяющий метод имеет то же имя, количество и тип параметров, а также возвращаемый тип, что и метод, который он переопределяет. Переопределяющий метод также может возвращать подтип типа, возвращаемого переопределенным методом. Этот подтип называется ковариантным типом возвращаемого значения.

При переопределении метода вы можете использовать аннотацию @Override, которая сообщает компилятору, что вы собираетесь переопределить метод в суперклассе. Если по какой-либо причине компилятор обнаружит, что метод не существует ни в одном из суперклассов, то он сгенерирует ошибку.

Поэтому я бы рекомендовал прочитать официальный документ.