【发布时间】:2010-01-26 09:21:38
【问题描述】:
最近一直在写类似这样的代码:
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(..);直接或间接从工厂获得一个。
但是。我还没有看到这种方法在其他地方被广泛使用。以上是好习惯吗?对于简单的情况,还有其他/更好的选择吗?
【问题讨论】:
-
为什么会有人将“Message”缩写为“Messge”?是不是笔误?
-
好问题!我一直这样做,一直想知道这是否是犹太洁食。除了我的声明是:
std::auto_ptr<MessageHandler> CreatePersistMessageHandler();