今天在逛CSDN的时候,看到一个帖子http://bbs.csdn.net/topics/390750400,说什么继承被打压,组合比继承优秀,瞬间吓尿了......不是被lz说的话吓的,而是我写了几年程序,居然没听说过组合。难道是我孤陋寡闻,跟不上时代了。赶紧百度了一下。
看了http://socket.blog.163.com/blog/static/20987300420099238350634/这位博主的解说,我松了一口气。组合不就是一个成员变量么,什么时候有了"组合"这么高上大的名字。
不过既然来了,那我也多说两句。看下面的代码,这就是组合了,
#include <iostream> using namespace std; class base { public: void show(); }; class test { private: base _base; }; int main(int argc,char *argv[]) { test _test; }
而下面的就是继承了:
#include <iostream> using namespace std; class base { public: void show(); }; class test : public base { }; int main(int argc,char *argv[]) { test _test; }
如果要调用基类的show函数,用继承则比较方便。组合则需要在test类再写一个函数调用。但继承也不见得就比组合适用。之前在项目中遇到过这么一种情况。一个玩家对象类USER,继承了一个NET类(用于向客户端发送数据,已封装为底层,不可修改),这本来也挻合适。可是到后来处理抢号登录时,即同样的号把另一台设备顶掉。最好的办法就是把USER里的socket断掉,然后把新登录的socket连接到USER对象上就OK了。然而由于是继承NET类的,没法把新登录的socket连接到USER对象。如果改为组合,则解决了问题。
所以所谓用哪个更好,还得根据业务需求来确定。