2010-01-26 67 views
6

最近我一直在寫類似的代碼這隱藏實現:抽象類 - 在C++實踐

messagehandler.h:

#include "message.h" 
class MessageHandler { 
public: 
    virtual ~MessageHandler() {} 
    virtual void HandleMessage(Message *msg) = 0: 
}; 

persistmessagehandler.h:

MessageHandler *CreatePersistMessageHandler(); 

persistmessagehandler。 CPP:

#include "messagehandler.h" 
#include "persist.h" 

class PersistMessageHandler : public MessageHandler { 
private: 
    PersistHandle ph; 
    size_t count; 
    InternalCheck(); 
public: 
    PersistMessageHandler(int someParam); 
    virtual ~PersistMessageHandler(); 
    virtual void HandleMessage(Message *msg): 
}; 
PersistMessageHandler::PersistMessageHandler(int someParam) 
{ 
    ph.Initialize(); 
} 
... rest of implementation. 

MessageHandler *CreatePersistMessageHandler(int someParam) 
{ 
    return new PersistMessageHandler(someParam); 
} 

這裏的推理是隱藏PersistMessageHandler。客戶端不需要爲PersistMessageHandler類包含一個頭文件,包含實現可能需要的所有包含和類型,並且更乾淨地分離接口和實現。 。它會永遠被動態分配無論如何,

所有PersistMessageHandler用戶將只需要調用CreatePersistMessageHandler(..);直接或間接從工廠獲得一個。

但是。我還沒有看到這種方法在別處很多。上述的良好做法?對於簡單情況,還有其他/更好的選擇嗎?

+0

爲什麼有人會將「消息」縮寫爲「消息」?這是一個錯字嗎? – unwind 2010-01-26 09:24:30

+0

偉大的問題!我一直這樣做,一直想知道它是否是猶太教。除我的聲明是:'的std :: auto_ptr的<的MessageHandler> CreatePersistMessageHandler();' – 2010-01-26 09:25:26

+0

參見http://stackoverflow.com/questions/825018/pimpl-idiom-vs-pure-virtual-class-interface – Frank 2010-02-03 15:17:58

回答

6

你總是要儘可能隱藏。你的方式(將實現類放入.cpp中)是在C++中執行此操作的常用方法。

2

這是從客戶端隱藏實現細節的好方法。如果你在Windows下工作,你也可以考慮使用__interface而不是抽象基類。

一個接口是一個MSVC編譯器擴展,它看起來像一個抽象基類,但是對於創建和銷燬的規則與普通的C++類不同。這是Windows中的標準工作方式,因此有系統支持的工具可用於處理進程外對象並在.NET代碼中使用它們。

0

最大限度地減少依賴於實施細節確實很大,和隱藏的東西超出了抽象基類(ABC,又名接口)是一種好的和慣用的解決方案。

使用ABC的缺點是,你失去了你的類的值語義這可能是或可能是不能接受的/可取的。

一種技術也隱藏實現細節沒有這個缺點是Pimpl。猜你應該知道。

在大多數情況下,我更喜歡ABC。

+0

@CraigMcQueen錯字應該是ABC(抽象基類)。謝謝! – 2013-09-12 22:09:11