繁体   English   中英

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

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

我有一个问题。

我应该在抽象类中创建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());
    }
}

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

是的,如果某个方法对于大多数期望的抽象类实现是通用的,那么在抽象类中实现这些方法就可以了。 如果为您的Human的属性配备吸气剂和吸气剂真的很好,那就很难说了。 当前使用它的方式没有多大意义,因为您将行为方面(viewIndividual)与数据方面(getter和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的实现中一遍又一遍地重复此代码,因为只需要覆盖internalMethod即可。

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

不,绝对不是。 至少只要您不向方法中添加其他功能,就不应仅在可实例化类中实现抽象方法就覆盖抽象方法。

通常,如果在深度类型层次结构中实现某些内容,则继承应格外小心,因为代码往往变得很难理解。 IMHO层次结构已经开始变得难以使用,层次结构级别为4-5,但这很可能是基于意见的。 有一条规则是优先选择组合而不是继承,以避免对简单的实用工具过度使用继承。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM