Recientemente he estado escribiendo código similar al siguiente:clase abstracta - ocultando aplicación en la práctica 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);
}
El razonamiento aquí es ocultar PersistMessageHandler. Los clientes no necesitan incluir un encabezado para la clase PersistMessageHandler, con todas las inclusiones y tipos que la implementación pueda necesitar, y para separar más limpiamente la interfaz y la implementación. . Siempre se asignará dinámicamente de todos modos,
Todos los usuarios de PersistMessageHandler simplemente llamarán a CreatePersistMessageHandler (..); directa o indirectamente obtener uno de una fábrica.
Pero. No he visto este enfoque usado mucho en otros lugares. Es la buena práctica anterior? ¿Hay otras/mejores alternativas para casos simples?
¿Por qué alguien podría abreviar "Mensaje" a "Messge"? ¿Es un error tipográfico? – unwind
¡Buena pregunta! Hago esto todo el tiempo y siempre me he preguntado si era kosher.Excepto que mi declaración es: 'std :: auto_ptr CreatePersistMessageHandler();' –
Vea también http://stackoverflow.com/questions/825018/pimpl-idiom-vs-pure-virtual-class-interface – Frank