Recentemente ho scritto un codice simile a questo:classe astratta - nasconde implementazione in C++ pratica
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);
}
Il ragionamento qui è quello di nascondere PersistMessageHandler. I client non devono includere un'intestazione per la classe PersistMessageHandler, con tutti gli include e tipi che potrebbero richiedere l'implementazione e separare in modo più pulito l'interfaccia e l'implementazione. . Sarà sempre assegnato dinamicamente comunque,
Tutti gli utenti di PersistMessageHandler chiameranno semplicemente CreatePersistMessageHandler (..); ottenere direttamente o indirettamente uno da una fabbrica.
Ma. Non ho visto questo approccio usato molto altrove. È la buona pratica di cui sopra? Ci sono altre/migliori alternative per casi semplici?
Perché qualcuno dovrebbe mai abbreviare "Messaggio" in "Messge"? È un errore di battitura? – unwind
Ottima domanda! Lo faccio sempre e mi sono sempre chiesto se fosse kosher.Tranne la mia dichiarazione è: 'std :: auto_ptr CreatePersistMessageHandler();' –
Vedere anche http://stackoverflow.com/questions/825018/pimpl-idiom-vs-pure-virtual-class-interface – Frank