关闭

组合和继承

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3491次
    • 积分:89
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条