很形象的接口的使用——针对初学者

简介:

里氏代换原则是什么?听起来很高深,不过我们也不是什么学院派,就不讲大道理了,直接拿个例子来说一下。
我们拿人和程序员举个例子。人是一个大类,程序员是继承自人的子类。看看这句话:人需要吃饭。这句话我们把“人”换成“程序员”,就是:程序员需要吃饭,这样换不会有什么问题。现在我们反过来,把“程序员可以用计算机写程序”里边的程序员换成“人”,就是:人可以用计算机写程序。这样就不一定正确了,否则问题可就大了,我们这些程序员只怕没得饭吃了。
这个就是里氏代换原则:使用父类的地方肯定可以用它的一个子类来替换掉,但是使用一个子类的时候用它的父类来替换就不一定正确了。
好,现在我们回到程序设计里边来。
看看下面的程序:
一个学校里边,有两种人:学生、老师。他们都要吃饭和睡觉。


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);
 
轻松搞定家长的食宿问题!
 
这样一来学校来再多的客人都没关系啊,绝对可以应付自如,这也就是传说中的可扩展性!
不知道初学者看到这里是不是能够明白接口的作用。如果你还不明白,那么你把人这个接口去掉,自己写一个学校开饭和放学的类,然后再加一个家长这个新新人类进去,看看你的代码是什么样子的,再想一下在人口这么多的中国,万一哪天你的学校里来了成千上万个新新人类你该怎么办!




本文转自 vfast_chenxy 51CTO博客,原文链接:http://blog.51cto.com/chenxy/761828,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
设计模式 算法 程序员
代码之禅:从功能实现到艺术表达的技术感悟
【2月更文挑战第15天】 在数字世界的无限画布上,每一行代码都承载着创造的力量。本文透过作者多年的技术探索与实践,探讨编程不仅仅是逻辑的堆砌和功能的实现,更是一种深度思考与艺术表达的过程。从最初的代码拼凑者到后来的架构设计者,再到如今追求代码艺术性的实践者,文章将带领读者一同走进程序员的内心世界,感受那些被键盘敲击声激发出的灵感火花。
|
8月前
|
设计模式 分布式计算 算法
一些令人惊叹的编程方式:
一些令人惊叹的编程方式:
89 1
|
11月前
|
编译器 C语言 C++
c++ 对类与对象的基础框架+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(一)
c++ 对类与对象的基础框架+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(一)
|
11月前
|
编译器 C语言 C++
c++ 对类与对象的基础框架+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
c++ 对类与对象的基础框架+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
|
设计模式 前端开发 JavaScript
图解23种设计模式(TypeScript版)——前端切图崽必修内功心法
图解23种设计模式(TypeScript版)——前端切图崽必修内功心法
图解23种设计模式(TypeScript版)——前端切图崽必修内功心法
|
存储 Java C++
最熟悉的陌生人——你真的了解面向对象吗?
最熟悉的陌生人——你真的了解面向对象吗?
最熟悉的陌生人——你真的了解面向对象吗?
|
JavaScript Java 编译器
编程简单科普系列 - 什么是编程 (1)
广义上来说,编程也不仅仅是指关于计算机的范畴,现在通常也指可以diy的东西,可以通过自己想法进行自定义的东西。当然我们这里所说的是指计算机编程. 因为计算机是不能直接听懂我们人说话的,没办法直接沟通,所以我们需要通过编程语言来跟计算机进行沟通,通过编程语言把我们想表达的转化为计算机能听懂的,在这里编程语言就相当一个翻译(比如,我们不会英文,准备要和一说英文的外国人谈生意,这时候就需要找一个英文翻译,替我们把想要表达的中文翻译成对方听得懂的英文。)其实严谨点这个比喻说也不准确,因为编程语言一般是需要通过编译器或者解释器编译解释之后,才能为计算机所识别. 每个计算机编程语言,都有自己的编译器或者解
306 0
|
存储 运维 小程序
都无代码编程了,编程还香吗
11月29日(2020年),腾讯举行了一场主题为 “重新定义开发” 的小程序开发技术峰会,发布的了新一代的云开发平台,用少量代码,甚至不用代码,就可以快速创建一个云应用,大幅降低应用开发门槛,让人人都能做开发,那么对于程序员以及打算学习编程的人来说,何去何从呢?
166 0
都无代码编程了,编程还香吗
|
编译器 数据库 C++
领悟面向对象就离开发应用不远了(类提高)有你对面向对象的所有疑问,爆肝1w字
领悟面向对象就离开发应用不远了(类提高)有你对面向对象的所有疑问,爆肝1w字
128 0
|
算法 程序员