1.里氏替换原则
里氏替换原则(Liskov Substitution Principle)
- 继承虽然允许子类重写继承来的方法,但是如果子类随意修改继承的方法,就会对整个继承体系造成破坏。
- 继承在给程序设计带来便利的同时,也带来了弊端。比如一个类被其他的类所继承,当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能产生故障
- 里氏替换原则(如何正确使用继承)
1.2 案例
- 代码
public class LiskovOne {
public static void main(String[] args) {
//丙开发,丙看到方法名,认为该方法表示:这是鲁迅写的书
B b = new B();
b.luXunBook();
}
}
class A {
/**
* 甲开发的
* 假设:方法名的含义是:鲁迅的书
*/
public void luXunBook(){
System.out.println("这是鲁迅写的书");
}
}
class B extends A{
/**
* 乙开发的,
* 乙重写了该方法
*/
@Override
public void luXunBook() {
System.out.println("这本书是鲁迅的");
}
}
- 思考
问题:有时子类在重写父类的方法时,已经改变了父类的含义(如上述),这样在调用时就会存在风险。
方案: 通用的做法是:原来的父类和子类都继承一个更通俗的基类,原有的继承关系去掉,
采用依赖,聚合,组合等关系代替.(说白了就是去掉继承关系) - 改进
public class LiskovTwo {
public static void main(String[] args) {
B b = new B();
b.luXunBook();
}
}
class Base{
//基础的属性和方法
}
class A extends Base{
public void luXunBook(){
System.out.println("这是鲁迅写的书");
}
}
class B extends Base{
public void luXunBook() {
System.out.println("这本书是鲁迅的");
}
}
1.3 总结
- 里氏替换原则告诉我们该如何正确使用继承
- 所有引用父类的地方必须能透明地使用其子类的对象。
- 在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法
- 里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可
以通过聚合,组合,依赖 来解决问题