Является ли хорошей практикой создание методов внутри абстрактного класса, а не переопределение их внутри класса, который его расширяет? - PullRequest
0 голосов
/ 25 февраля 2019

У меня вопрос.

Должен ли я создавать методы getter и setter внутри абстрактного класса?Приведенный ниже пример содержит эти методы внутри абстрактного класса, который расширяется классом IndividualЯвляется ли хорошей практикой иметь разное разнообразие методов внутри абстрактного класса?Должен ли я переопределять эти методы внутри класса Individual?Однако мне не имеет смысла переопределять их, так как они не сделают ничего другого, просто установят и получат другие атрибуты.Любой совет?

public abstract class Human {
    private String name;
    private String surname;

    public Human(String name, String surname) {
        this.name = name;
        this.surname = surname;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }
}


public class Individual extends Human{
    private String dob;

    public Individual(String name, String surname, String dob) {
        super(name, surname);
        this.dob = dob;
    }

    public String getDob() {
        return dob;
    }

    public void setDob(String dob) {
        this.dob = dob;
    }

    public void viewIndividual(){
        System.out.println("First name of individual is: " + getName());
        System.out.println("Surname of individual is: " + getSurname());
        System.out.println("Date of birth of individual is: " + getDob());
    }
}

1 Ответ

0 голосов
/ 25 февраля 2019

Должен ли я создавать методы получения и установки внутри абстрактного класса?

Да, если метод является общим для большинства ожидаемых реализаций абстрактного класса, то прекрасно реализовать эти методы в абстрактном классе.Если действительно хорошо иметь геттеры и сеттеры для свойств вашего Human, трудно сказать.То, как вы в настоящее время используете его, не имеет особого смысла, поскольку вы смешиваете аспекты поведения (viewIndividual) с аспектами данных (методы получения и установки) в одном классе.Учитывая приведенный выше код, вы будете в порядке с защищенными членами в абстрактном классе и потенциально с установщиками, чтобы избежать дублирования кода в реализациях.Но если вы хотите использовать ваши объекты в качестве Java-бинов, это нормально.

Разве это хорошая практика - иметь разное разнообразие методов внутри абстрактного класса?

Выподразумеваете как абстрактные, так и неабстрактные методы?Да, это довольно стандартно.Возьмем следующий пример:

public abstract class Example {

  public final void publicMethod() {
    // do some preparations
    internalMethod();
    // do some cleanup
  }

  protected abstract void internalMethod();
}

Потребители реализаций Example смогут получить доступ только к publicMethod, и гарантируется, что все необходимые подготовительные и очистительные задачи выполняются без повторения этого кода снова и снова.в реализациях Example необходимо переопределить только internalMethod.

Должен ли я переопределять эти методы внутри класса Individual?

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

В общем, вы должны быть осторожны с наследованием, поскольку код имеет тенденцию становитьсяочень трудно понять, если вы реализуете что-то в глубокой иерархии типов.ИМХО иерархии начинают становиться трудными для использования с уровнем иерархии 4-5, но это, вероятно, в значительной степени основано на мнении.Существует правило предпочитать композицию наследованию, чтобы избежать чрезмерного использования наследования для простых служебных вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...