组合和继承

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

相关文章推荐

组合查询——如何使用窗体的继承达到事半功倍?

一个优秀的程序员就是要尽可能减少自己的代码量。我们日常的工作或者学习中都有可能遇到多个窗体结构类似,或者大同小异的情况,这时候如果在每个窗体都写一遍代码,或者纯粹的复制粘贴就太水了。想要偷懒的时候正是...

继承、实现、依赖、关联、聚合、组合的联系与区别

继承 指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字exten...

C++继承和组合

  • 2013-08-07 21:24
  • 651KB
  • 下载

面向对象设计中的继承、组合、聚合

在c++和java世界里,面向对象设计是老话题,基本上看过一两本书,做过一点开发的人,你问他关于面向对象设计中的继承、组合、聚合,他肯定能回答出来,也会写基类、派生类、java中的接口等等. 但...

Java中的复用类——继承、组合和代理hello

一:继承   继承按现有类创建一个对象,不改变现有类,采用现有类的形式向其中添加新代码;(编译器强制你去初始化基类,是is_a 的关系,比如说Student继承Person,则说明Student i...

C++习题 继承与组合

Problem C: C++习题 继承与组合 [Submit][Status][Web Board] Description 已知类如下: (1) BirthDate(生日类) 含...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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