Нужно ли реализовывать унаследованные методы в Java? - PullRequest
1 голос
/ 19 апреля 2019

Я новичок в том, что касается Java, и у меня есть два вопроса, которые меня действительно волнуют ...

  1. Разве @Override не является дублированием кода? Я имею в виду, позвольте мне рассмотреть ситуацию. Я реализую функцию в классе Parent. Затем я создаю класс Child, который наследует этот метод от класса Parent. Теперь я могу использовать эту функцию, не реализовав ее еще раз в классе Child - она ​​работает. Но это хорошая практика? Или, может быть, мне следует написать @Override и снова реализовать эту функцию?
  2. Нужно ли @Override сеттеров и геттеров из класса Parent? (И реализовать их в Child - как в предыдущем вопросе). Или, может быть, они должны быть абстрактными в родительском классе? Заранее спасибо:)
class Animal { /*Parent class*/
    private int numOfLegs;
    protected String sound;

    public Animal(int numOfLegs, String sound) {
        this.numOfLegs = numOfLegs;
        this.sound = sound;
    }

    public int getNumOfLegs() {
        return numOfLegs;
    }

    public void makeSound() {
        System.out.println(sound);
    }
}

class Dog extends Animal{ /*Child class*/
    public Dog(int numOfLegs, String sound) {
        super(numOfLegs, sound);
    }

    @Override /*Is it necessery to implement an inherited function?*/
    public void makeSound() {
        System.out.println(sound);
    }

    /*Do I need to implement an inherited getter?/*

}

Ответы [ 3 ]

2 голосов
/ 19 апреля 2019

Точка переопределения, как следует из названия, заключается в переопределении / замене / изменении поведения родительского метода. Нет смысла переопределять метод с той же реализацией. Вы можете просто использовать унаследованный метод, если не хотите ничего менять.

1 голос
/ 19 апреля 2019

Вы должны переопределить свой метод из родительского класса, только если вы хотите переопределить суперкласс. Но вы должны переопределить все методы Iterface, когда вы реализуете его некоторыми из ваших классов.

Итак, вы можете использовать какой-либо метод в классе Dog, например super.makeSound () или Just makeSound (), если вы не хотите переопределять его в классе Child, например, не издавать звук, а делать прыжок или что-то в этом роде. остальное.

1 голос
/ 19 апреля 2019

Разве @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"
}
...