背景
上一篇我总结了一下依赖倒转原则,查了很多资料发现凡总结依赖倒转原则的时候,大多数人也会把里氏代换原则顺道也给总结了。Why?还是让我们先来看看里氏代换原则(Liskov Substitution Principle,LSP)吧。
定义
Functions that use pointers or referencesto base classesmust be able to use objects of derived classes without knowingit.(子类型必须能够替换掉它们的父类型。)
详细说明
通俗的将就是一个软件实体如果使用的是一个父类的话,那么一定使用于其子类,而且它觉察不出父类对象和子类对象的区别。也就是说,在软件里,把父类都替换成他的子类,程序的行为没有变化。
示例
例1:比方说,猫是继承动物类以动物的身份拥有吃、喝、跑、叫等行为,当某一天我们需要猪、牛、羊也拥有类似的行为,由于它们都集成动物,所以处理更改实例化的地方,程序其他处不需要改变。
(ps:正是由于里氏代换原则,才使得开放-封闭成为可能)
例2:里氏代换原则是倒转依赖原则的基础,由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展。
(ps:这里有更加详细的例子http://www.jb51.cc/article/p-bpoqmpkv-pe.html)
优劣
优点
代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;提高代码的重用性; 提高代码的可扩展性;提高产品或项目的开放性。
缺点
继承是侵入性的。只要继承,就必须拥有父类的所有属性和方法;降低代码的灵活性。子类必须拥有父类的属性和方法,让子类自由的世界中多了些约束;增强了耦合性。当父类的常量、变量和方法被修改时,必需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来非常糟糕的结果——大片的代码需要重构。
(更优秀的文章:http://wenku.baidu.com/link?url=_Gm0QpDzm8sNJvJ0N3LsHhx-Ooot4OPV4N6C7MVQR1ficR09SxOlq4IT6GrweUHg9hWnDOvdz3_LOWLTNIprv1dNiagqdCvy_Y8x0p0yjiK)