@cppexplore
再看了下你的实现,好像我们讨论的着重点不一样。
1. 你的系统里,是不是首先有这样一个需求:
因为某种原因(分布式,进程间,无锁线程),消息的发送者不能直接调用消息处理函数,而是传送一个消息代码来表示需要处理的类型?
消息代码即是win32中的WM_XX或者你的系统中的 enum MsgType { MSG_TYPE_1=65, ... };
2. 消息的处理者,又需要按照约定(即消息代码的含义),将其映射到某个处理函数中。
如 win32 中
switch (message) {
case WM_XXX:
return OnXXX(hwnd,message,wparam,lparam);
...
}
或者你的系统中的
switch(msg->type)
{
case MSG_TYPE_1:
do_msg_type_1_();
break;
case MSG_TYPE_2:
do_msg_type_2_();
break;
..
default:
do_default_msg_();
break;
}
在这一步,确实是你的实现方式时间效率比较高。
但是在win32中, 这样做不太现实 …… 1000多个消息,表格就要包含1000多项,而且大多都是DefWndProc。
并且,在这一步中,虚函数根本就提供不了任何帮助。
你的着重点在这一步?
3. 你想实现一个消息处理者B,它对大多数消息的处理方式同A一样,这时候如何尽可能的使用A的实现?
(暂不说依赖于某实现是不太恰当的设计,在MFC中多如牛毛……)
我的着重点在这里,我对处理这步的观点是: 『消息类型做数组下标了,直接定位取处理函数』与『覆写虚函数』相比,时空效率是相同的,我觉得后者更容易理解和扩展。