【问题标题】:Is it a good practice to create methods inside an abstract class and not override them inside the class which extends it?在抽象类中创建方法而不是在扩展它的类中覆盖它们是一种好习惯吗?
【发布时间】:2019-07-18 18:36:20
【问题描述】:

我有一个问题。

我应该在抽象类中创建 getter 和 setter 方法吗?下面的示例包含由 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());
    }
}

【问题讨论】:

  • 没关系。但是抽象类的重点是至少要有一个抽象方法。
  • 这正是抽象类的意义所在(与接口相反),您可以定义 一些 方法而不必被覆盖。
  • 抽象类的子类必须实现(覆盖)其抽象超类的所有抽象方法。超类的非抽象方法只是按原样继承。如果需要,它们也可以被覆盖。
  • 设置 getter 和 setter 周期是不好的做法。您将您的课程视为愚蠢的数据包。根据对象的行为来考虑对象。在您的情况下,您应该能够打印Individual。也许这就是它所能做的一切,这很好。为什么您需要能够更改每个字段?
  • 如果您认为抽象类的某些 default 方法不应该被覆盖,您可以将它们设为 final。该类的其他实现当然会使用/访问这些方法,但不能覆盖它们。

标签: java inheritance methods abstract


【解决方案1】:

我应该在抽象类中创建 getter 和 setter 方法吗?

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

在抽象类中使用不同的方法是一种好习惯吗?

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

public abstract class Example {

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

  protected abstract void internalMethod();
}

Example 实现的消费者将只能访问publicMethod,并且保证在Example 的实现中不会一遍又一遍地重复此代码,因为只有@ 987654326@ 需要被覆盖。

我应该在 Individual 类中覆盖这些方法吗?

不,绝对不是。至少只要您不向方法添加额外的功能,就不应该仅仅为了在可实例化类中实现它们而重写抽象方法。

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

【讨论】:

    猜你喜欢
    • 2017-06-14
    • 2016-05-20
    • 1970-01-01
    • 2020-02-06
    • 2014-11-22
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多