巩固Java基础之接口

2017/08/29 java

巩固Java基础之接口

里氏代换原则是什么?听起来很高深,不过我们也不是什么学院派,就不讲大道理了,直接拿个例子来说一下。

我们拿人和程序员举个例子。人是一个大类,程序员是继承自人的子类。看看这句话:人需要吃饭。这句话我们把“人”换成“程序员”,就是:程序员需要吃饭,这样换不会有什么问题。现在我们反过来,把“程序员可以用计算机写程序”里边的程序员换成“人”,就是:人可以用计算机写程序。这样就不一定正确了,否则问题可就大了,我们这些程序员只怕没得饭吃了。

这个就是里氏代换原则:

使用父类的地方肯定可以用它的一个子类来替换掉,但是使用一个子类的时候用它的父类来替换就不一定正确了

好,现在我们回到程序设计里边来。 看看下面的程序: 一个学校里边,有两种人:学生、老师。他们都要吃饭和睡觉。

public interface {
    void 吃饭();
    void 睡觉();
}
 
public class 学生 implements {
    public void 吃饭(){
        //去食堂吃饭
    }
    public void 睡觉(){
        //回寝室睡觉
    }
    ...//其他特有方法
}
 
public class 老师 implements {
    public void 吃饭(){
        //回家吃饭
    }
    public void 睡觉(){
        //回家睡觉
    }
    ...//其它特有方法
}
 
public class 学校{
    public void 开饭( ren){
        ren.吃饭();
    }
    public void 放学( ren){
        ren.睡觉();
    }
}

这里就用到了里氏代换原则,”开饭() “和”放学() “的参数都是人,那么这个地方如果换成学生和老师肯定也可以。

 a = new 学生();
学校.开饭(a);
学校.放学(a);

这样执行的结果就是学生回寝室吃饭。

 b = new 老师();
学校.开饭(b);
学校.放学(b);

这样执行的结果就是老师回家吃饭。

为什么要这样写呢?这样写有什么好处呢? 我在开饭的时候完全可以直接调用”学生.吃饭();“、”老师.吃饭();“啊。 接着看。

有一天,学校里来了第三种人,家长。

家长既不是去寝室睡觉也不是回家睡觉,而是旅馆睡觉,既不是去食堂吃饭也不是回家吃饭,而是去下馆子。

这个时候学校这个系统该怎么处理呢?

如果原来没有定义”人”这个接口那就麻烦啦,所有用到人的地方代码都要改。

现在不一样了,我可以直接定义一个类:家长,这个类实现人这个接口就可以了。 好,看代码:

public class 家长 implements {
    public void 吃饭(){
        //下馆子
    }
    public void 睡觉(){
        //去旅馆睡觉
    }
    ...//其它特有方法

在调用的时候不需要修改任何代码,还和原来一样:

 c=new 家长();
学校.开饭(c);
学校.放学(c);

轻松搞定家长的食宿问题!

这样一来学校来再多的客人都没关系啊,绝对可以应付自如,这也就是传说中的可扩展性


注:本文转载自网站

Search

    Table of Contents