随笔 - 119  文章 - 290  trackbacks - 0

博客搬家了哦,请移步
叫我abc

常用链接

留言簿(12)

随笔分类

我的博客

搜索

  •  

积分与排名

  • 积分 - 299475
  • 排名 - 84

最新评论

阅读排行榜

对于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 阅读(942) 评论(1)  编辑 收藏 引用

FeedBack:
# re: 稳定的基类和灵活的派生类 2008-04-23 14:44 刀刀
CView 视窗的OnPain()和Draw()的关系就是上面的关系  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理