3.里氏替换原则(构建扩展性更好的系统)
里氏替换原则英文全称是Liskow Substitution Principle(LSP),里氏替换原则有两种定义方式,第一种定义方式为,如果对于每一个类型为X的对象X1,都有类型为Y的对象Y1,使得所有使用类型为Y的程序P在把对象Y1替换成X1时,程序的行为没有发生变化,那么,类型X是类型Y的子类。第二种定义比较简单易懂,所有引用基类的地方必须能透明的使用其子类的对象。
大家都知道,面对对象语言的三大特点是封装、继承和多态,里氏替换原则就是依赖其中的继承和多态两大特点。里氏替换原则简单来说,就是在一个系统中,在需要用的地方可以使用子类来替换掉父类,这样并不影响系统的行为,但是,子类不可被父类替换,毕竟子类是继承父类实现的,父类的属性和方法可以继承到,但是子类还是有自己独特的方法的。所以,可以再把这个这种形式的在细说下,就是抽象。
下面以一个实例来看下里氏替换原则:
首先,大家都知道在Android中Window和View的关系,是依赖的(不是接口的依赖),而我们所知道的大部分View,如Button,TextView等都是继承自View的,这些View而且又是多种多样的,他们和View有共用的方法,但是绘制起来确实千变万化,而且,这些View都可以给Window设置展示,先看下UML类图,如下
那么看下代码是怎么实现的:
public class Window{
public void show(View view){
view.draw();
}
}
public abstract class View{
public abstract void draw();
public void measure(int width,int height){
}
}
public class Button extends View{
public void draw(){
}
}
public class TextView extends View{
public void draw(){
}
}
综上可以看出,在OOP中,继承的优缺点相当的明显。
优点:
(1)代码的重用性,减少创建类的成本,但可以拥有父类的属性和方法
(2)子类与父类基本类似,但又有些区别
(3)可以提高代码的可扩展性
缺点:
(1)继承是具有入侵性的,只要我继承了父类,不管用的到的还是用不到的方法和属性,都会被沿用下来
(2)造成子类代码冗余,灵活性降低。
事物都是具有两面性的,如何权宜利弊要根据实际情况来判定选择,里氏替换原则指导我们构建更好的可以扩展的系统,但是我们还是要根据自己的实际需求来判断在适当的时候使用不同的规则,这样才会使自己的系统更加完善更加健壮。