先考虑组合再考虑继承

继承对面向对象来说可能有先入为主的影响, 常使人认为继承代表了多态,代表了抽象,代表了面向对象。

面向对象其实是说从对象的观点来思考问题,即一切都是对象。并不是说面向对象就必须要有上下级的层次关系,必须有基类,他只是一种看待问题的方式。

继承会增加层次和layer,layer一多就不好控制,继承带来了接口污染和不必要的复杂度,每增加一层就使得下层的类需要担心更多问题,upcast也就越难。

组合将结构扁平化,更加容易符合设计的几大原则,也更加符合面向接口的思想,因为组合将职责分离了,运行时需要哪个再组合,更容易产生内聚性强的类,使得复用性大大增加。

继承则由于继承的关系将行为限制在了基类,任何继承于它的都会受到限制,因为子类必须对上层接口负责。

组合在运行时可选择不同的状态结合到对象中使用,不必对组合对象内部行为负责,只需要遵循他的接口把参数传给他,然后接收返回结果就行了,这样就把自己的行为委托出去了。

对象之间的互动如果是组合的方式,将有极大的灵活性,并且降低整个结构的层级数,而如果是继承,比方说我为了用某个接口而继承一个类,这样代价很大,而且会污染了自己的接口,因为每一次继承其实都创造了一个新的基类,这个基类的接口由上层接口和自己的接口组成。

---------------

现在做的一个设计就是一开始加入了太多的继承关系,以为这就是抽象,现在觉得接口越来越丑陋,不堪了,看来先考虑组合再考虑继承可能适合大多数情况把。

posted @ 2011-05-13 15:21  babykick  阅读(335)  评论(0编辑  收藏  举报