Реализация шаблонных интерфейсов в C ++ с унаследованными конкретными классами - PullRequest
0 голосов
/ 06 апреля 2020

В моем приложении Clini c я использую шаблон проектирования DAO для доступа к БД. Я создал шаблон интерфейса DAO

template <class T>
class DAO{
public:
    virtual std::unique_ptr<T> get(int id) = 0;
    virtual std::list<T> getAll() = 0;
    virtual bool add(T obj) = 0;
    virtual bool update(T ob1, T obj2) = 0;
    virtual bool remove(int id) = 0;
};

Кроме того, у меня есть эта иерархия людей, связанных с клини c - Базовый класс Person, производные классы Patient и Doctor.

Я создал реализацию интерфейса DAO для Person.

class PersonDAO : virtual public DAO <Person>, public SQLManager
{
public:
    virtual std::unique_ptr<Person> get(int id);
    virtual std::list<Person> getAll();
    bool add(Person obj);
    bool update(Person oldData, Person newData);
    bool remove(int id);
};

В моем приложении я не работаю с Person объектами - я использую только Patient и Doctor, поэтому я бы Мне нравится использовать методы из PersonDAO, например, при разборе объектов в / из объектов, поэтому я не дублирую код. В этом случае я реализовал этот класс PatientDAO

class PatientDAO : virtual public DAO<Patient>,  public PersonDAO
    {
    public:
        std::unique_ptr<Patient> get(int id);
        std::list<Patient> getAll();
        bool add(Patient obj);
        bool update(Patient oldData, Patient newData);
        bool remove(int id);

    };

В результате я получил эти две ошибки

'PatientDAO :: get': тип возвращаемой переопределенной виртуальной функции отличается и не ковариантный из «PersonDAO :: get»

«PatientDAO :: getAll»: тип возвращаемой переопределенной виртуальной функции отличается и не является ковариантным из «PersonDAO :: getAll»

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

...