组合和继承

原创 2007年10月06日 11:47:00
 
类的组合和继承是软件复用中经常用到的方式。通常来说,我们提倡优先使用类的组合方式 ,而不是继承。继承和组合各有优缺点:
1。依赖程度
      很显然,对于继承来说,它是白箱。子类需要知道其上层父类的实现,同时父类的改变直接影响到其下层子类。子类是严重依赖其父类的。从实践经历来说,当子类很多而且子类之间的功能对于有些子类是一样的,对于有些子类又是不一样的,碰到这种情况,就需要非常小心,根据实际情况恰当运用设计模式进行抽象分解,而设计不好父类往往非常臃肿,沉重,给以后的维护留下隐患。所以,继承是紧密依赖的,其不宜上层臃肿,最好是实现很少的抽象类,层次不宜过深,最好是23层。
         但组合可以规避紧密的依赖关系,只需知道引用的对象接口,而不关心其实现。单一、独立、属于某个领域的功能完全可以通过一个对象去完成。减少类之间的相互依赖关系。
2。效率
         一般来说,继承的代码执行效率要高于组合。因为继承是在静态编译时就已经决定了,而组合是在运行时通过动态引用决定的。
3.灵活复用性
当需要复用父类的某些功能,但如果继承下来的实现又不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。而组合是运行时动态决定的,在接口类型一致的情况下,可以动态的进行替换,而不关心具体如何实现。
4。易于理解性
组合将功能分解成一个个单一职责的类,类之间没有很强的耦合关系,概念比较分散,需要一个个去理解。而继承是一种高内聚的设计,理解了父类,子类是非常容易理解的。
5。代码重用程度
         很显然,继承是子类依赖于父类的,父类抽象的很多功能在子类中都是可以重用的,子类只关心自己的个性化特征,父类的功能直接在子类中得到继承,其代码重用程度是非常高的。而组合是低耦合的设计,类之间是很独立的,相互之间只能通过类对象动态的重用功能,也有可能会引起很多参数的传递处理,势必造成很多不必要的中间代码,可读性、易于理解性也不是很好。
纵上所知,组合和继承各有自己的优缺点,在实际编码中只然根据实际情况作出选择,在可能的情况下优先使用组合。在难以决定的情况下,考虑一下使用委托,委托是组合的一个特例,委托的主要优点是运行时刻组合操作对象及改变这些操作的组合方式,说的通俗一点,就是将一个需要重用的功能封装成一个类或一个接口,而后在运行时根据实际情况初始化这个类对象或接口对象,在遇到相应问题时交由这个类对象或接口对象处理就可以了。一方面使组合的代码得到了重用,又考虑了个性化特征。在设计模式中,StateStrategyVisitor等都用到了委托的方式,在一定程度上,委托可以代替继承。
 

面向对象编程的几个关键概念继承、多态、组合

一、继承、接口与多态的相关问题:1、 继承的作用?好处?坏处?继承:通过继承实现代码复用。Java中所有的类都是通过直接或间接地继程java.lang.Object类得到的。继承而得到的类称为子类,被...

.NET重构(四):窗体继承+模板方法,完美实现组合查询

导读:在机房重构中,有好些个查询都是大同小异,最为显著的就是组合查询了。怎样给自己省事儿,相同的东西能不能重复利用,就成了一个现实的问题。第一遍做机房的时候,使用的更多的是:复制+粘贴。学习了设计模式...

Scala入门到精通——第九节 继承与组合

主要内容 类的继承 构造函数执行顺序 方法重写 匿名类 多态与动态绑定 组合与继承的使用 1 类的继承 下类的代码演示了scala类的继承 //Person类 class Pers...

Python 进阶_OOP 面向对象编程_组合与继承

目录 目录 前言 组合 派生 前言 我们定义一个类是希望能够把类当成模块来使用, 并把类嵌入到我们的应用代码中, 和其他的数据类型/逻辑执行流结合使用. 一般来说我们可以使用两种...
  • Jmilk
  • Jmilk
  • 2016年11月06日 13:14
  • 2154

Notes: Java的访问权限、组合/继承和多态

本文章对应《Thinking in Java》的6、7、8章内容。 Chapter 6:  Java访问权限限制的动机:方便库程序员修改工具类的具体实现而不用知会客户端程序员修改客户端代码。作...

从头认识java-6.3 组合使用聚合和继承

这一章节我们来讨论一些组合使用聚合和继承之前已经讲过想过的基础知识以及注意点,现在我们直接上代码:1.例子package com.ray.ch05; public class PlaceSettin...

UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合) 继承、实现、依赖、关联、聚合、组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类、子接口)继...

设计模式---继承和组合

 1.什么是继承 A继承B,说明A是B的一种,并且B的所有行为对A都有意义 A=鸵鸟 B=鸟 (不行),因为鸟会飞,但是鸵鸟不会。 2.什么是组合 若在逻辑上A是B的“一部分”(a...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:组合和继承
举报原因:
原因补充:

(最多只允许输入30个字)