Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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_Inheritance - Fatal编程技术网

Java:仅当构造函数不同时使用继承

Java:仅当构造函数不同时使用继承,java,inheritance,Java,Inheritance,我需要在一个服务中实现相同的命令序列,但根据具体情况在几个不同的数据库对象上操作。我想知道在这种情况下使用继承是否是一种好的做法——这将包括只在特定类的构造函数中传递不同的dao。大概是这样的: public abstract class Service{ private Dao dao; public Service(Dao dao){ this.dao = dao; } public void mainMethod(){

我需要在一个服务中实现相同的命令序列,但根据具体情况在几个不同的数据库对象上操作。我想知道在这种情况下使用继承是否是一种好的做法——这将包括只在特定类的构造函数中传递不同的dao。大概是这样的:

 public abstract class Service{

   private Dao dao;

    public Service(Dao dao){
        this.dao = dao;
    }

    public void mainMethod(){
        dao.step1();
        subMethod();
        dao.step2();
    }

    public void subMethod(){
       //...
    }
}


public class ServiceImpl1 extends Service{

   public ServiceImpl1(DaoImpl1 daoImpl1){
       super(daoImpl1);
   }
}

继承对于将消息(方法调用)委派给超类非常有用,只需要很少的更改。不过,您并没有将消息委托给父类,而是在更改构造函数的参数。所以没有必要继承任何东西

这很好:

public class Service{ 
    private Dao dao;

    public Service(Dao dao){
        this.dao = dao;
    }

    public void mainMethod(){
        dao.step1();
        subMethod();
        dao.step2();
    }

    public void subMethod(){
       //...
    }
}
然后,您可以创建如下实例

Service posgresService = new Service(new PosgresDao());
Service redisService = new Service(new RedisDao());

有关更多详细信息,请参见。

我认为如果-命令序列-指的是完全相同的命令,我认为您应该创建重载方法,例如:如果不是,继承将是一个很好的选择,以便在代码中保留orden。

因为您正在谈论继承,并且从示例代码中提供,似乎每个DaoImpl类都有一个ServiceImpl类。它可以工作,但是您也可以为所有Dao类使用一个ServiceImpl类:

public class ServiceImpl implements Service {

    public void mainMethod(Dao dao) {
        dao.step1();
        subMethod();
        dao.step2();
    }

    public void subMethod() {
        // ...
    }
}
别处

Service service = new ServiceImpl();

// ...

Dao dao1 = new DaoImpl1();
Dao dao2 = new DaoImpl2();

// ...

service.mainMethod(dao1);
service.mainMethod(dao2);

如果要在多个不同类型的对象上运行相同的操作,那么这些对象本质上必须具有相同的行为。这意味着这些类都应该实现相同的接口,定义您的
step1()
step2()
方法,因此您不需要子类,只需要服务来获取接口。从您发布的代码中,不需要子类,一个服务可以处理所有
Dao
子类,如果它们被传递到
main方法
,而不是作为实例成员持有。