Chinaunix首页 | 论坛 | 博客
  • 博客访问: 234090
  • 博文数量: 127
  • 博客积分: 34
  • 博客等级: 民兵
  • 技术积分: 655
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-03 10:53
文章分类

全部博文(127)

文章存档

2013年(19)

2012年(108)

分类:

2012-10-21 18:06:27

2.2 继承和组合(Composition

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

 

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

 

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

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

 

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








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