里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现;并且完全察觉不出父类对象和子类对象的区别。
里氏代换原则是一个规范性原则,它是继承复用的基石。只有按照这个规范来具体化抽象,才能保证这个系统正常运行!
代码定义:
// 如果D派生自B;B、D指向同一对象;则test_func(b) 与 test_func(d)效果完全相同 class B { } class D : public B { } client: D* d = new D(); B* b = d; test_func(b) test_func(d)
要实现这个原则,需要满足一下条件
①public继承
②不要覆盖、重载基类中的任何函数。
③子类必须具有父类的所有性质。
下面看看几个违背里氏代换规则的例子:
一、鸟与企鹅
在生物学上,企鹅属于鸟类。所以你一定认为企鹅派生自鸟类没有问题。但注意,这里是软件学!不是生物学!众所周知,鸟是可以飞的,那么鸟类中肯定有一个fly函数。若企鹅派生自鸟类,那么根据里氏替换原则,企鹅具有父类所有的性质。换言之,就是企鹅也会飞了。会飞的企鹅,那还是企鹅吗?!
这个例子告诉我们,在继承时,一定要遵守里氏替换原则,使子类具有父类的所有性质!
二、覆盖基类函数
class A{ public int func1(int a,int b){ return a-b; } } class B extends A{ public int func1(int a,int b){ return a+b; } } public class Client{ public static void main(String[] args){ B b = new B(); A a = b; System.out.println("100-50="+a.func1(100,50)); System.out.println("100-80="+b.func1(100,50)); } }
这里会发现,同样是B的对象,同样的运算,两个结果却截然不同。
原文链接:https://www.f2er.com/javaschema/285715.html