Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1938195
  • 博文数量: 77
  • 博客积分: 2175
  • 博客等级: 大尉
  • 技术积分: 2491
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-20 20:49
个人简介

欢迎光临我的博客

文章分类

全部博文(77)

文章存档

2023年(1)

2018年(4)

2017年(1)

2016年(2)

2015年(2)

2013年(5)

2012年(29)

2010年(33)

分类: C/C++

2010-05-01 15:58:10

2.2 继承和组合(Composition

继承和组合是两种常见的代码重用方式。组合是通过对现有的对象进行拼装集成产生新的、更复杂的功能。因为在对象之间,各自的内部细节是不可见的,所以我们也说这种方式的代码复用是黑盒式代码复用。从代码重用的角度来看,父类的大部分内部细节对于子类是可见的。所以我们通常也可以说通过继承的代码复用是一种白盒式代码复用

 

事实上,继承和组合都是在新类型中潜入已存在的类型的子对象(继承隐式嵌入了父类对象)。然而,当我们想重用原类型作为新类型的内部实现的话(原类型对使用者不可见),最好使用组合;如果我们不仅想重用原类型的内部实现,还想重用原来接口的话那就使用继承(原类型对使用者可见),它还能向上映射到这个父类,这一点对多态性很重要。

 

除此之外,根据Coad规则,仅当下列的所有标准被满足时,方可使用继承:
a.子类表达了是一个的特殊类型,而非是一个由所扮演的角色
b.子类的一个实例永远不需要转化(transmute)为其它类的一个对象。
c.子类是对其父类的职责(responsibility)进行扩展,而非重写或废除(nullify)。
d.子类没有对那些仅作为一个工具类(utility class)的功能进行扩展。
e.对于一个位于实际的问题域(Problem Domain)的类而言,其子类特指一种角色(role),

 交易(transaction)或设备(device)。

 

一个常见的例子是PersonAgentPassenger的例子。虽然AgentPassenger都属于Person,但它们其实只是Person的一种角色,而且可能会相互转化甚至并存,所以不适合于继承。可以用下列两种方式实现:








《返璞归真--UNIX技术内幕》在全国各大书店及网城均有销售:
                         
                       
阅读(11183) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~