在抽象 class 中创建方法而不是在扩展它的 class 中覆盖它们是一种好习惯吗?

Is it a good practice to create methods inside an abstract class and not override them inside the class which extends it?

我有一个问题。

我应该在抽象 class 中创建 getter 和 setter 方法吗?下面的示例在抽象 class 中包含这些方法,它由 Individual class 扩展。在 abstract class 中使用不同的方法是一种好习惯吗?我应该覆盖 Individual class 中的那些方法吗?但是,覆盖它们对我来说没有意义,因为它们不会做任何不同的事情,只是设置和获取不同的属性。有什么建议吗?

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());
    }
}

Should I create getter and setter methods inside abstract class?

是的,如果一个方法对于大多数预期的抽象实现是通用的 class,那么在抽象 class 中实现这些方法是完全没问题的。如果为您的 Human 的属性设置 getter 和 setter 真的很好,这很难说。您当前使用它的方式没有多大意义,因为您将行为方面 (viewIndividual) 与数据方面 (getters 和 setters) 混合在一个 class 中。鉴于上面的代码,您可以在抽象 class 中使用受保护的成员,并可能使用 setter 来避免实现中的代码重复。但是,如果您想将对象用作 Java-Beans,那很好。

Is it a good practice to have different variety on methods inside abstract class?

你是指抽象方法和非抽象方法?是的,这是非常标准的。举个例子:

public abstract class Example {

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

  protected abstract void internalMethod();
}

Example 实现的消费者将只能访问 publicMethod 并且保证执行所有需要的准备和清理任务,而无需在实现中一遍又一遍地重复此代码Example 因为只有 internalMethod 需要覆盖。

Should I be overriding those methods inside Individual class?

不,绝对不是。至少只要你不向方法添加额外的功能,抽象方法不应该仅仅为了在实例化中实现它们而被覆盖 class.

一般来说,如果您在深层类型层次结构中实现某些内容,您应该小心继承,因为代码往往会变得非常难以理解。恕我直言,层次结构开始变得难以使用,层次结构级别已经达到 4-5,但这可能在很大程度上是基于意见的。规则是优先使用组合而不是继承,以避免为简单的实用程序过度使用继承。