我现在的回调方式是用boost::function,它在TR1时已经进入 C++ 标准库。Boost::function不对类型和函数名做限制,只对参数和返回类型做部分限制。如果你通过传统的继承来回调的话,你这个类型必须是framework里某个基类的派生类,函数的名字必须一样,参数列表必须一样,返回类型也基本肯定是一样。但是boost::function没有这些限制。Muduo网络库不是一个面向对象(object-oriented)的库,它是一个基于对象(object-based)的库。它在接口上没有表现出继承的特性,它用的是boost function的注册/回调机制,网络事件的表示就用 boost function。所以对Muduo来讲,它不需要知道你写什么类,也不强迫继承,更不需要知道你的函数叫什么名字,你给它的就是一个 boost function对象,限制就很少。而且你没有把对象指针传给网络库,那么就可以按原有的方式管理对象的生命期。”
--------------陈硕,开源社区访谈实录
面向对象的三大特点(封装,继承,多态)缺一不可。通常“基于对象”是使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点。而“多态”表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”。现在的很多流行技术都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属性。但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判断。“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而“基于对象”没有实现这些。
本文通过实现Tread类来比较两种编程风格的差别。
(一)面向对象编程风格
Tread类图