李氏替换原则是以提出者命名的,是指对父类对象的引用在替换成子类的时候也可以保证编译和逻辑不出现异常。
在日常开发中,我们经常会对父类的方法进行重写,从而可能导致没有遵循李氏替换原则,这样有一个坏处,在他人调用此被重写的方法时,子类被当做父类使用,而编译不会报错,但是得不到应有的返回值,使代码出问题的几率大大增加。
但子类就是为了对父类进行更精确的描述和拓展而存在,所以在李氏替换原则下,子类在对父类进行修改的同时要尽可能不重写父类,即使进行重写,需要保证入参和返回值的精确性。没有对父类方法进行重写的时候很好理解。那么举一个重写父类方法的例子
例如
父类:哺乳动物类,
{
getLegs(){
return 四条腿;
}
}
子类:马
{
getLegs(){
return 四条马腿;
}
子类:牛
{
getLegs(){
return 四条牛腿;
}
子类:人
{
getLegs(){
return 四肢;
}
这样既对子类进行了更精确的描述,也保证了李氏替换原则的成立。或者在重写父类方法时,先调用一下父类的方法。
所以很多人对多态和李氏替换原则是否相悖持疑问的时候就得到了很好的解答。
在学习的同时写下了这篇博客,理解可能不够透彻甚至有错误,希望得到大家的指正,包括技术方面和写作方面,感谢!