憋了很长一段时间的想法,在这里说说,希望听听诸位高手的意见。
我写过不少C++程序(当然比起高手还是差远了),写过库也写过客户程序。一般库都会提供一些好用的类供客户程序使用,不少库还可以让客户程序响应库内的某些事件。比如MFC/ATL/VCL提供消息响应,很多ActiveX提供自定义消息响应,甚至是系统底层的中断调用都可以列入这个范畴。然而,正是以上这些“反向”的调用让我觉得很烦恼。
1 继承+多态
乍一看是理所当然的选择,库中的类把响应处理函数设置为虚函数,客户程序可以继承这个类并且重载响应函数。以某个Socket类为例,可以提供一个OnRecv函数用来响应网络数据包到达的处理。客户程序只需要重载OnRecv并进行自己的处理就可以了。
struct Socket { // base class
virtual void OnRecv();
};
stuct MySocket { // your event-handle class
virtual void OnRecv() { /* do sth here ... */ }
}
疑问:很多时候这样做实在很烦,特别是做小程序的时候,或者需要快速做原型的时候,一眼望去小小的程序一上来就继承了一大堆东西,颇为不爽。只是想着能省事一点,希望能像那些脚本语言一样快速绑定消息响应,而不是以继承开始工作——我已经害怕看到长长的类继承树了,很多时候根本不必要继承整个类;又或者某些类只提供一个接口而不是具体的类又或者需要多重继承,处理都有一定麻烦;最麻烦的莫过于有时候需要改变响应处理,难道继承好几个下来么——这么多虚表也是浪费啊。
wangtianxing老大点评:为了使用Socket就必须继承Socket,这可以说是Socket的设计的问题。如果需要实现类似的功能的话,可以写成如下,虽然和继承 Socket 没有多少本质的差别,不过确实把消息处理类和Socket的实现扯开了。: