面向对象设计原则(一)里氏替换原则
面向对象设计原则:
一、LSP(里氏替换原则)
1.定义
i. 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有变化,那么类型S是类型T的子类型。
ii. 所有引用基类(父类)的地方必须能透明地使用其子类的对象。
上述定义类似于数学上的定义,其实简单来说就是:子类型必须可以替换基类对象。
2.为达到目的:子类不能添加任何父类没有的附加约束,在可能的情况下,由抽象类(接口)继承。
3. ①只要有可能,不要从具体类继承。
②行为集中地方向是向上的(抽象类)
③数据集中的方向是向下的(具体类)
4.在实际工作中个人建议可以用聚合来尽可能的替代继承(个人建议)
5.实例:长方形和正方形。
众所周知,正方形是一种特殊的长方形,那么是否可以理解为长方形是正方形的父类,假设有两个类Rectangle和Square。
在许多场景下,比如计算面积等,这样做都是可以的;但是在有些情景下,如果按这样来设计的话,程序则会出现一些问题。
比如:Rectangle的属性里有长length和宽width,而正方形里则统一是边side(假设它们都是int类型)。这样更符合我们现实生活。(注意:计算机里长即为长,宽即为宽,如果不作处理计算机不会因为宽大于长而将宽改变为长,方便理解)
假设有一个方法compare(这里是方便理解所写):当宽小于等于长时,宽+1,直至宽大于长。
public void compare(){
while(width<=length){
width = width + 1;
}
}
而如果正方形继承这个方法,那么正方形的边side(不论长宽)则都会同时增长,陷于死循环。
如图:
接下来,我们根据设计原则来进行修改:
使用里氏代换原则对其进行重构后,使得系统可以灵活扩展。
总结:子类型必须可以替换基类对象。
重复一下:子类不能添加任何父类没有的附加约束,在可能的情况下,由抽象类(接口)继承。
重复一下:
①只要有可能,不要从具体类继承。
②行为集中地方向是向上的(抽象类)
③数据集中的方向是向下的(具体类)
如有错误,还请指出,非常感谢!!
下一篇: zk服务器端获取鼠标点击位置