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

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

评论:
# re: 很形象的接口的使用——针对初学者 2007-09-17 12:41 | 中华乞丐
谢谢 我是一个JAVA初学着,对于接口,父类,子类很模糊,看了你的文章好象明白点了  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 2007-09-20 18:17 | 点点
赞同楼上的,好像明白了不少,很形象的例子  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 2007-09-30 02:47 | 熊猫
讨厌JAVA呀

  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 [未登录] 2008-01-05 22:30 | neil
很形象的例子,多谢多谢,收获颇丰,呵呵!!!
还有再来滴~~~~~~  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 [未登录] 2008-03-10 01:49 | 小马
恩 很不错 很喜欢你的文章 虽然只能看懂一些简单的 呵呵 还是谢谢了   回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 2009-04-28 21:51 | mstar
good  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 [未登录] 2009-07-28 21:23 | Louis
哎 受教了,有一个大概的理解了,谢谢,话说我还应该看一下你的其他文章呢  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 2009-11-05 11:14 | 耗子吴
豁然开朗,哈哈!比喻的好!  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 2009-12-02 09:53 | 骚动
从来看帖不顶,不过这例子写的确实好,而且很幽默哦,
又如生儿育女传宗接代的历史使命努力等不足为外人道的事情晓之以钱,
又如动之以利等等,不一而足
学习了!!  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 2009-12-09 00:21 | kobe
挺不错的例子,谢谢了  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 [未登录] 2010-01-21 11:28 | 小蚂蚁
学习就该这样,多一点幽默、诙谐 让死板的代码也活跃起来  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 2010-04-14 14:14 | maytures
good...  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 2010-06-07 15:53 | dingwei
写得非常好啊!人才!!  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 2010-11-05 16:29 | 猪满天飞
扯淡 这种问题应该用抽象类  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 2010-11-07 17:19 | 获得法律手段
很生动的例子,想法很好!支持!虽然初学java,但是对这些复杂概念的理解必须要深刻才行。切记“勿在浮沙筑高台!”。  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 2010-11-11 21:03 | 说明
你说的很表面。
虽然感觉上是形象,但在实际应用中,真正理解的人少。
可以说看过你说的这个,
从感觉上来说,会有100%的人明白。
但对于实际应用中的逻辑来说,只会有10%的人明白,可能更少。

因为有时候道理大家都懂,但这个道理对我们有什么帮助却不懂。
这是我给你的建议。

可以在想想,怎么才能让理解率更高一些,作为一个老师来说,不能按自己的思维去传授学生,应该学会理解大众思维,聚焦个性思维。  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 2011-11-28 20:32 |
可以  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 [未登录] 2013-05-11 21:11 | 可可
不错  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 2013-05-28 11:29 | 小王
牛!我顶!  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 [未登录] 2014-01-09 09:43 |
碉堡了  回复  更多评论
  
# re: 很形象的接口的使用——针对初学者 2014-03-16 11:45 | sir
@中华乞丐
呵呵,通俗易懂,真不错!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: