我当然不知道如何标题这个问题,抱歉。
我在设计以下系统时遇到了一些问题。
我需要一个可以完成一些工作的课程,但是这项工作可以通过一系列不同的方式完成,比如说这项工作将通过“司机”完成。
这些驱动程序可以有不同的接口,因此我需要为每个驱动程序构建一个包装器。
所以我得到了(或者我需要):
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();
答案 0 :(得分:3)
对我来说,你的基本想法似乎很好。我会考虑将驱动程序的创建分为factory(或至少factory method)。
答案 1 :(得分:1)
这对我来说似乎很合理。具有FactoryMethod或类(AbstractFactory)基于某个配置值创建所需具体子类的对象是一种常见模式。
您可以考虑让MainClass
实现类似
DriverInterface* createDriver(const string& driverType)
而不是在DriverInterface
中封装生成的具体MainClass
子类。但是如果你只想要一个具体的DriverInterface
实例,那么上面看起来很好。
答案 2 :(得分:0)
我会将“driver_0”传递给构造函数,并从那里调用MainClass :: set_driver。然后,您可以将MainClass :: set_driver设为私有,除非您需要更改驱动程序。