Наследование: основной метод в родительском классе с указанием c реализации нескольких методов в дочернем классе - PullRequest
1 голос
/ 31 января 2020

Мне нужно реализовать два схожих процесса, которые в основном выполняют одинаковую логику c, но некоторые параметры / методы могут отличаться. Мне интересно, будет ли хорошей практикой извлекать основной лог c в родительский класс и указывать результат нескольких методов для дочерних классов. Что-то вроде:

abstract class Parent{

protected CommonDao commonDao;

protected String specStatus;

protected abstract int getDbResult();

public Parent(CommonDao commonDao){
    this.commonDao = commonDao;
}

public String mainLogic(){
    if(commonMethod()){
    //..
    }
    int specDbResult = getDbResult();
    //some logic here

    return specStatus;
}

private boolean commonMethod(){ 
//.. 
return true;
}

}

@Service
public Child1 extends Parent(){

  @Autowired
  public Child1(CommonDao commonDao){
     super(commonDao);
     super.specStatus = specStatus1;
  }

  @Override
  protected String getDbResult(){
      commonDao.getResult1();
  }

}

@Service
public Child2 extends Parent(){

  @Autowired
  public Child2(CommonDao commonDao){
     super(commonDao);
     super.specStatus = specStatus2;
  }

  @Override
  protected String getDbResult(){
      commonDao.getResult2();
  }

}

Если это не чистый код, какое решение вы бы порекомендовали в таком случае? Заранее спасибо

1 Ответ

0 голосов
/ 31 января 2020

Используя внедрение зависимостей, композиция, очевидно, является лучшим подходом, чем наследование

И дао как атрибут недостаточно для отношений родитель-потомок

Пожалуйста, убедитесь, что вы поняли пункт 16 вступления в силу Java, как любой программист может http://thefinestartist.com/effective-java/16

EDITED по запросу:

@Service
public class NotAChild{

@Autowired
CommonOps1 commonOps1;

@Autowired
CommonOps2 commonOps2;

private boolean commonMethod(){ 
int result1 = commonOps1.getDbResult(); 
int result2 = commonOps2.getDbResult(); 
....
return result1 + result2;
}
}

@Component
public class CommonOpS1{

@Autowired
CommonDao commonDao;

protected String getDbResult(){
      commonDao.getResult1();
}

}

@Component
public class CommonOpS2{

@Autowired
CommonDao commonDao;

protected String getDbResult(){
      commonDao.getResult2();
}

}

Все другие объекты NotAChildN могут использовать общий методы CommonOps.

Итак, вы не будете использовать наследование

...