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