2010-10-21 42 views
0

我當然不知道如何標題這個問題,對不起。C++如何實現這個接口配置?

我在設計以下系統時遇到了一些問題。

我需要一個能完成一些工作的類,但是這項工作可以通過一系列不同的方式完成,比如說這項工作將通過「驅動程序」完成。

這些驅動程序可以有不同的接口,因此我需要爲每個驅動程序構建一個包裝。

所以我得到了(或者我需要)這樣的:

 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. 其實我現在編譯時有一些問題,臭名昭着的vtable沒有定義在Driver_0中......這與我想實現的目標有一些關係嗎? 已更新:我通過刪除* Driver_Interface *構造函數來解決此問題。
+0

爲什麼使用字符串來指定驅動程序?您是否閱讀用戶輸入的驅動程序選擇? – wilhelmtell 2010-10-21 15:23:18

+0

只是爲了懶惰,我知道我應該使用ENUM舉例,但我只是從這開始。 – 2010-10-21 15:29:46

回答

3

對我來說,你的基本想法似乎很好。不過,我會考慮將創建驅動程序分成factory(或至少是factory method)。

+0

新的Driver_0()是在「MainClass」內部製作的,因此它被封裝。你是這個意思嗎? – 2010-10-21 15:24:53

+2

@clinisbut,作爲第一步,是的。根據具體情況,我可能希望將創建代碼從MainClass中移出,以消除具體Driver子類的依賴關係。如果你只有一些固定的子類,這可能不成問題,並且創建它們很簡單。但是如果你有很多,並且/或者創建它們很複雜,那麼創建代碼會混淆'MainClass'。或者,如果您希望添加新的,則無需進行此分離,每次添加或刪除驅動程序時都需要重新編譯MainClass。 – 2010-10-21 15:28:34

+0

+1有關可維護性的評論 – 2010-10-21 16:01:56

1

這對我來說似乎很合理。有一個FactoryMethod或類(AbstractFactory)基於某些配置值創建所需的具體子類的對象是一種常見模式。

你可以考慮具有MainClass實現諸如

DriverInterface* createDriver(const string& driverType) 

代替MainClass封裝所得到的混凝土DriverInterface子類的東西。但如果你只想要一個具體的DriverInterface實例,上面看起來很好。

0

我會傳遞「driver_0」給構造函數,並從那裏調用MainClass :: set_driver。除非需要更改驅動程序,否則您可以使MainClass :: set_driver爲private。