1、简介
里氏替换原则的定义是 子类必须能够完全替换父类,使父类能够得到充分使用。
这个有点像是青出于蓝,可以替代蓝的意思。
为了能够达到这种效果,里氏替换的父类和子类 需要满足一下几个基本原则:
1)里氏替换原则使开闭原则的重要方式
2)子类可以扩展父类的功能,但不能改变父类原有的功能
图文比较抽象,我们举一个鸟 ,燕子,麻雀的例子。
2、举例说明
1) 鸟 作为父类 Bird,我们设定两个方法:
canFlay 会飞
haveFeather 有羽毛
package myapplication.lum.com.bird;
import android.util.Log;
public class Bird {
private String TAG = "TAG_";
public void canFlay(){
Log.i(TAG,"bird can fly");
}
public void haveFeather(){
Log.i(TAG,"bird have feather");
}
}
2) 燕子 作为一个子类继承 鸟
但是它又有自己的一个说明 是益鸟
goodBird
package myapplication.lum.com.bird;
import android.util.Log;
public class Swallow extends Bird {
private String TAG = "TAG_";
public void canFlay(){
super.canFlay();
}
public void haveFeather(){
super.haveFeather();
}
public void goodBird(){
Log.i(TAG,"Swallow good bird");
}
}
- 麻雀 作为 一个继承的子类
也有自己的说明是坏鸟
badBird
package myapplication.lum.com.bird;
import android.util.Log;
public class Sparrow extends Bird {
private String TAG = "TAG_";
public void canFlay(){
super.canFlay();
}
public void haveFeather(){
super.haveFeather();
}
public void badBird(){
Log.i(TAG,"Sparrow bad bird");
}
}
4)我们在主函数调用 燕子和 麻雀
package myapplication.lum.com.bird;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Swallow swallow = new Swallow();
swallow.canFlay();
swallow.haveFeather();
swallow.goodBird();
Sparrow sparrow = new Sparrow();
sparrow.canFlay();
sparrow.haveFeather();
sparrow.badBird();
}
}
打印的 loig:
同样 因为父类出现的地方能够替换成子类
所以我们 我们依照燕子 为子类,把麻雀 中出现的父类都替换成子类,尝试 麻雀是否还能够正常显示。
//public class Sparrow extends Bird {
public class Sparrow extends Swallow {
再次运行:
我们看到 整个程序并没有受到影响。
里氏替换原则 能够很好的解决 共性 和个性之间的问题,类的扩展不会给已有的系统带来新的问题,境地代码出错可能。