Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 继承和实用方法及变量_Java_Oop - Fatal编程技术网

Java 继承和实用方法及变量

Java 继承和实用方法及变量,java,oop,Java,Oop,我习惯于仅在child类是super类的更具体版本时使用继承。因此,我想知道从祖先继承一个类,只在父类中存储一个变量(所有继承的类都将使用该变量)是否正确 例如: public abstract class EmployeeDetail{ private final Employee executor; public EmployeeDetail(final Employee executor) { this.executor = executor;

我习惯于仅在child类是super类的更具体版本时使用继承。因此,我想知道从祖先继承一个类,只在父类中存储一个变量(所有继承的类都将使用该变量)是否正确

例如:

public abstract class EmployeeDetail{
    
    private final Employee executor;

    public EmployeeDetail(final Employee executor) {
        this.executor = executor;
    }

    protected Employee getExecutor(){
        return this.executor;
    }

    public abstract boolean edit(final Employee id);

}

public class EmployeeDetailLevel1 extends EmployeeDetail {

  public EmployeeDetailLevel1(final Employee executor) {
    super(executor);
  }

  public boolean edit(final Employee id){

    // some implementation that works with parent executor variable
    return false;

  }

}
问题:

  • 从OOP的角度来看,这段代码正确吗?在这种情况下,可能是的,因为父类
    EmployeeDetail
    指定了一个抽象方法,但是如果没有抽象/常规方法呢
  • 如果我需要一些使用所有子类的实用方法呢?我应该将其移动到另一个静态实用程序类中,还是可以放入
    EmployeeDetail

  • 以下是我不这么做的几个原因:

    • 超类是一个坏对象。它不抽象任何东西,也就是说,它不包含任何它独有的知识
    • 它不封装它的状态。也就是说,它的状态不是私有的
    • 二者紧密耦合,如果超类发生变化,子类可能会中断,Liskov等。子类化代价高昂
    • 更重要的是,它表明缺少抽象

    每次你有一个“实用工具”,或者想以这种方式“共享代码”,这意味着你缺少一个抽象。需要有一些东西能做你想分享的事情,而且是专门做的。它可能同时为不再需要此逻辑的下游事物定义不同的接口。

    以下是我不这么做的几个原因:

    • 超类是一个坏对象。它不抽象任何东西,也就是说,它不包含任何它独有的知识
    • 它不封装它的状态。也就是说,它的状态不是私有的
    • 二者紧密耦合,如果超类发生变化,子类可能会中断,Liskov等。子类化代价高昂
    • 更重要的是,它表明缺少抽象

    每次你有一个“实用工具”,或者想以这种方式“共享代码”,这意味着你缺少一个抽象。需要有一些东西能做你想分享的事情,而且是专门做的。它可能同时为不再需要这种逻辑的下游事物定义一个不同的接口。

    为什么不正确?它仍然使它更具体,因为每个EmployeeDetailLevel 1都可能是EmployeeDetail,而不是每个EmployeeDetail都是EmployeeDetailLevel 1在这种情况下,我更感兴趣的是存储变量的问题以及“效用”的存在使用继承类的方法-如果可以将其放在父类中或排除在外部实用程序类中,为什么不正确?它仍然使它更具体,因为每个EmployeeDetailLevel 1都可能是EmployeeDetail,而不是每个EmployeeDetail都是EmployeeDetailLevel 1在这种情况下,我更感兴趣的是存储变量的问题以及“效用”的存在使用继承类的方法-如果可以将其放在父类中或排除在外部实用程序类中,您认为最好的方法是什么?如何在不使用超类的情况下实现这种类型的“共享”功能?有什么设计模式吗?我上面描述的可以总结为使用适配器模式进行组合而不是继承。基本上,您将“公共逻辑”打包到适配器中,并为所有不再需要此逻辑的适配器提供一个更简单的接口。您认为如何更好地实现这种“共享”功能而不使用超类?有什么设计模式吗?我上面描述的可以总结为使用适配器模式进行组合而不是继承。您基本上将“公共逻辑”打包到适配器中,并为所有适配器提供一个更简单的接口,这些适配器将不再需要此逻辑。