Разве @Override не является дублированием кода?
Если вы дублируете тот же код (как в родительском), вы теряете балл за то, что предназначено для переопределения: Определите новый код для метода, который уже определен вашим родителем.
Напротив, речь идет о повторном использовании кода: мы повторно используем то, что полезно для использования (методы, которые мы не переопределяем и не хотим повторять в совершенно новом отдельном классе), и мы только переопределение, которое необходимо изменить.
... это хорошая практика?
Это не вопрос хорошей практики переопределения кода, а вопрос изменения поведения метода, унаследованного от родительского класса (есть много причин, почему мы это делаем)
Или, может быть, я должен написать @Override и реализовать эту функцию один раз
снова?
Опять же, вы переопределяете метод только в случае необходимости.
Теперь, что является хорошей практикой - когда вы переопределяете метод, вы ДОЛЖНЫ аннотировать его с помощью @Override
(если вы этого не сделаете, это тоже работает, но вы потеряете полезную информацию, которую может предоставить компилятор с этой аннотацией: например, проверьте, что вы на самом деле переопределяете метод и не создаете перегрузку, поскольку сигнатура метода отличается от сигнатуры в родительском элементе)
Нужно ли @Override сеттеров и геттеров из родительского класса?
Иногда, только если этого требует сценарий использования, но это не часто встречается.
Или, может быть, они должны быть абстрактными в родительском классе?
Про то, что они абстрактные, ну, это совершенно другая (но я знаю, тесно связанная тема).
Они должны быть абстрактными, только если в родительском классе недостаточно информации для реализации этих методов, информация, которая зависит от конкретной реализации (в дочерних классах).
Пример использования :
Большинство птиц летают, верно, некоторые другие этого не делают: если мы создадим класс Bird
, у нас может быть метод getMovement
, который возвращает «Fly». Теперь, если мы создадим класс Penguin
, нам потребуется , чтобы переопределить это, потому что они не летают. Также в классе Bird
есть метод getCover
, который возвращает «Перья», в классе Penguin
нам не нужно его переопределять, потому что у них тоже есть перья:)
public class Bird {
// for most birds this is OK, they fly
public String getMovement() {
return "Fly";
}
public String getCover() {
return "Feathers";
}
}
public class Penguin extends Bird {
// penguins don't fly, so we need to override the parent method in order to create more realistic penguins
@Override
public String getMovement() {
return "Walk";
}
//we don't override getCover because penguins do have "Feather"
}