白话设计模式 之 里氏替换原则

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");
    }
}

  1. 麻雀 作为 一个继承的子类
    也有自己的说明是坏鸟
    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 {
再次运行:
在这里插入图片描述

我们看到 整个程序并没有受到影响。

里氏替换原则 能够很好的解决 共性 和个性之间的问题,类的扩展不会给已有的系统带来新的问题,境地代码出错可能。

原创文章 375 获赞 138 访问量 53万+

猜你喜欢

转载自blog.csdn.net/qq_27061049/article/details/104893242