为什么要定义interface
来源:互联网 发布:mac系统截图 编辑:程序博客网 时间:2024/06/05 19:17
通俗的讲,就是为了降低耦合度。
一个很搞笑的例子:
看看下面的程序: 一个学校里边,有两种人:学生、老师。他们都要吃饭和睡觉。
------------------------------
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);
轻松搞定家长的食宿问题!
这样一来学校来再多的客人都没关系啊,绝对可以应付自如,这也就是传说中的可扩展性! 不知道初学者看到这里是不是能够明白接口的作用。如果你还不明白,那么你把人这个接口去掉,自己写一个学校开饭和放学的类,然后再加一个家长这个新新人类进去,看看你的代码是什么样子的,再想一下在人口这么多的中国,万一哪天你的学校里来了成千上万个新新人类你该怎么办! 先声明一下,这个案例可不是我想出来的~~ 然后我们就很好理解了,为什么用别人的东西要实现接口呢?很直接的一个原因是这样一来,编程的复杂度就可能会大大降低了。
一个很搞笑的例子:
看看下面的程序: 一个学校里边,有两种人:学生、老师。他们都要吃饭和睡觉。
------------------------------
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);
轻松搞定家长的食宿问题!
这样一来学校来再多的客人都没关系啊,绝对可以应付自如,这也就是传说中的可扩展性! 不知道初学者看到这里是不是能够明白接口的作用。如果你还不明白,那么你把人这个接口去掉,自己写一个学校开饭和放学的类,然后再加一个家长这个新新人类进去,看看你的代码是什么样子的,再想一下在人口这么多的中国,万一哪天你的学校里来了成千上万个新新人类你该怎么办! 先声明一下,这个案例可不是我想出来的~~ 然后我们就很好理解了,为什么用别人的东西要实现接口呢?很直接的一个原因是这样一来,编程的复杂度就可能会大大降低了。
0 0
- 为什么要定义interface
- 为什么要定义接口?
- java为什么要用abstract与Interface?
- 为什么要写Java接口(Interface)
- 为什么要定义成虚析构函数
- 为什么要定义内部类??
- [Java] 为什么要定义接口
- JAVA 为什么创建interface
- Interface定义及使用
- Interface中定义属性
- Interface中定义方法
- 接口:定义形式 interface
- interface也来个abstract,至今不知道为什么要这样做
- 【interface】C#interface定义及使用浅析
- 为什么定义数组时要定义好数组大小
- 为什么类里既要定义字段又要定义属性
- 为什么C++要定义抽象基类
- 为什么要定义成integer类型
- tomcat classloader
- NAND FLASH 产品介绍(K9F2G08UA)
- 【转】Andriod 单元测试 Test run failed:Unable to find instrumentation target package的问题
- UBuntu9.10开发Java程序拦截inotify文件事件
- ZOJ-1501
- 为什么要定义interface
- 操作系统——动态分区存储管理(首次适应算法)
- XML(Extenxible Markup Language)可扩展标记语言,DTD(Document Type Definition)文档类型定义
- Linux下Socket编程
- 转自matrix67 十个利用矩阵乘法解决的经典问题
- uboot中nand flash代码分析(1)
- 二级指针
- sleep_on_timeout() -- 内核模块睡眠
- proguard.cfg和proguard-project.txt 混淆文件的用法与配置