C ++ Как достичь этой конфигурации интерфейса? - PullRequest
0 голосов
/ 21 октября 2010

Я, конечно, не знаю, как озаглавить этот вопрос, извините.

У меня возникли некоторые проблемы при разработке следующей системы.

Мне нужен класс, который сделает некоторую работу, но эту работу можно выполнить несколькими разными способами, скажем, что эта работа будет выполняться через «драйверы».

Эти драйверы могут иметь разные интерфейсы, и поэтому мне нужно создать оболочку для каждогоdriver.

Итак, я получил (или мне нужно) это:

       Me --->    MainClass   ---->    Wrapper ---->  Drivers

MainClass - это класс, к которому я буду прикасаться, и будет вызывать методы драйверов через разные оболочки.Вот пример использования:

MainClass worker;
worker.set_driver("driver_0");
worker.start_process();      //Start process calls a wrapper method which calls a driver's method.

Для этого я создал класс интерфейса:

class Driver_Interface : public QObject
{
     Q_OBJECT
 public:
   Driver_Interface(QObject* parent=0) : QObject(parent){}
   virtual bool open()=0;
   virtual bool close()=0;
   virtual bool write()=0;
   virtual bool set_config()=0;
};

Оболочка драйвера имеет такую ​​форму:

class Driver0 : public Driver_Interface
{
Q_OBJECT
public:
    Driver0( QObject* parent=0);
    Driver0();

    bool open();
    bool close();
    bool write();
    bool set_config();
};

НаконецЗдесь возникает противоречивая точка, определяющая MainClass: я хотел бы избежать создания одного члена для каждой оболочки, поэтому я попробовал это, и сейчас компилятор не жалуется:

class MainClass
{
public:
    MainClass();
    ~MainClass();
    void init();
    void set_driver( const QString& );
    void start_process();
protected:
    QString driver_str;
    Driver_Interface* driver;  //!<--- Here Here!!!
};

При установке драйверавыбрал, я делаю это:

if( driver_str.compare("driver_0")==0 )
     this->driver = new Driver_0();
  1. Это допустимая конфигурация C ++ или у меня рано или поздно возникнут проблемы?В основном, меня беспокоит создание драйвера другого типа, отличного от Driver_Interface, я вижу, что он запускается автоматически, и никто не жалуется ...
  2. На самом деле у меня сейчас есть некоторые проблемы с компиляцией печально известных таблицне определено в Driver_0 ... это имеет какое-то отношение к тому, чего я хочу достичь? ОБНОВЛЕНО : я исправил это, удалив конструктор * Driver_Interface *.

Ответы [ 3 ]

3 голосов
/ 21 октября 2010

Мне кажется, ваша основная идея в порядке.Я хотел бы разделить создание драйверов на фабрику (или, по крайней мере, фабрика метод ), хотя.

1 голос
/ 21 октября 2010

Это кажется мне разумным. Наличие FactoryMethod или класса ( AbstractFactory ), который создает объект требуемого конкретного подкласса на основе некоторого значения конфигурации, является распространенным шаблоном.

Можно подумать, что MainClass реализует что-то вроде

DriverInterface* createDriver(const string& driverType)

вместо инкапсуляции результирующего подкласса DriverInterface в MainClass. Но если вам нужен только один конкретный экземпляр DriverInterface, вышеприведенное выглядит хорошо.

0 голосов
/ 21 октября 2010

Я бы передал "driver_0" в конструктор и оттуда вызвал бы MainClass :: set_driver. Затем вы можете сделать MainClass :: set_driver приватным, если вам не нужно менять драйверы.

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