On The Road
(cond ((less 'code) (less 'bug)))
C++博客
首页
新随笔
联系
聚合
管理
随笔 - 119 文章 - 290 trackbacks - 0
博客搬家了哦,请移步
叫我abc
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(12)
给我留言
查看公开留言
查看私人留言
随笔分类
《GAME PROGRAMMING GEMS6》读书笔记(4)
《UNIX编程艺术》读书笔记(4)
month-flow(5)
mysql入门(3)
垃圾收集(4)
我的博客
叫我abc
博客搬家啦
搜索
积分与排名
积分 - 301918
排名 - 84
最新评论
1. re: C++ std::fstream open mode
i'am got
--hdj
2. re: cppcheck的使用
你好,你会使用cppcheck吗?@robert
--wqq
3. re: 垃圾收集的那点事(H)
非常感谢
--7Qing_
4. re: 高效调用lua函数
为什么提示没有findLuaItem这个函数?
--sdfasf
5. re: android ndk调试知识[未登录]
博主你好,请问如果没有.so的源代码,应该如何进行arm的汇编级调试呢?
--dennis
阅读排行榜
1. cppcheck的使用(16931)
2. 十步精通新语言(10624)
3. 内存池实现(9864)
4. 高效调用lua函数(9201)
5. 在lua脚本中使用unicode(8157)
稳定的基类和灵活的派生类
对于C/S类型的项目,总会有很多这样的类层次体系:
class
CItemMngBase
{
}
;
class
CItemMngS : CItemMngBase
{
}
;
class
CItemMngC : CItemMngBase
{
}
;
CItemMngS是服务器端的类,CItemMngC是客户端的类。CItemMngBase是一个已经实现了固有逻辑功能的类,包含了单机项目所需要的最基本代码。然后,CItemMngS将继承这个类,并对基类虚函数作出修改,增加网络发包的代码。CItemMngC也将继承这个类,同样也对基类虚函数作出修改,增加图形表现的代码。
令人不爽的问题是,基类提供的最小接口中,彻底实现了和网络、图形无关的逻辑功能,没有任何表现的,纯数据操作的。然后派生类将重载这些接口(虚函数),将基类的那套代码copy过来,并在合适的地方添加合适的网络代码或者图形代码。
重复这样的操作,引起的一个问题是,在基类中的固有代码还有什么意义,因为每个派生类都需要在固有代码中嵌入一些特殊的代码;另外一点是,这么copy和修改,谁还能保证派生类有好好履行基类所固定的功能的本质?
这个问题我当前所知应对方案有两种,一种是:
void
CItemMngX::AddItem( pItem )
{
CItemMngBase::AddItem( pItem );
//
这里做派生类的特殊处理(发包、图形)
}
这种方式已经能保证派生类利用并履行基类所提供的逻辑功能,但是插入的代码只能在基类逻辑功能完成后(一般不会放在前面的),但是如果派生类要把特殊代码插放在中间的话,就只好把逻辑功能的代码重温一遍了。
另一种方案作为这个方案的改进,是利用监听器模式:
void
CItemMngBase::AddItem( pItem )
{
//
some code
OnAddItem( pItem );
//
some code
}
void
CItemMngX::OnAddItem( pItem )
{
//
特殊处理,发包或者图形
}
利用这种模式,派生类根本就不需要关心基类到底提供了什么逻辑功能,并能在添加特殊处理的地方添加特殊处理。不过这种方案的一个问题是,你多数时候没有办法一开始就能确定所有需要的OnXXXX的函数,而是一个逐步向基类添加的过程。
我想要有效的解决这个问题应该是依靠某个设计模式。
好了,这就是我目前掌握的笨拙方案,期待能在回复中看到有创意的设计。^_^
posted on 2007-03-18 14:16
LOGOS
阅读(952)
评论(1)
编辑
收藏
引用
FeedBack:
#
re: 稳定的基类和灵活的派生类
2008-04-23 14:44
刀刀
CView 视窗的OnPain()和Draw()的关系就是上面的关系
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理