Java: использование наследования, если отличается только конструктор - PullRequest
3 голосов
/ 06 мая 2019

Мне нужно реализовать одну и ту же последовательность команд в сервисе, но работать с несколькими различными объектами базы данных, в зависимости от случая. Мне интересно, является ли хорошей практикой использование наследования в таком случае, которое будет заключаться в передаче другого дао только в конструкторе класса Specc. Примерно так:

 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);
   }
}

Ответы [ 3 ]

1 голос
/ 06 мая 2019

Наследование полезно для делегирования сообщений (вызовов методов) суперклассу с небольшими изменениями. Вы не делегируете сообщения родительскому классу, а изменяете параметр конструктора. Таким образом, нет необходимости наследовать что-либо.

Это нормально:

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());

Подробнее см. Внедрение зависимостей

0 голосов
/ 06 мая 2019

Поскольку вы говорите о наследовании и из примера кода, кажется, что для каждого класса DaoImpl будет один класс ServiceImpl. Это будет работать, однако вы также можете рассчитать один класс ServiceImpl для всех классов Dao:

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);
0 голосов
/ 06 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...