隨筆-208  評(píng)論-469  文章-30  trackbacks-0
          里氏代換原則是什么?聽(tīng)起來(lái)很高深,不過(guò)我們也不是什么學(xué)院派,就不講大道理了,直接拿個(gè)例子來(lái)說(shuō)一下。
          我們拿人和程序員舉個(gè)例子。人是一個(gè)大類(lèi),程序員是繼承自人的子類(lèi)??纯催@句話(huà):人需要吃飯。這句話(huà)我們把“人”換成“程序員”,就是:程序員需要吃飯,這樣換不會(huì)有什么問(wèn)題?,F(xiàn)在我們反過(guò)來(lái),把“程序員可以用計(jì)算機(jī)寫(xiě)程序”里邊的程序員換成“人”,就是:人可以用計(jì)算機(jī)寫(xiě)程序。這樣就不一定正確了,否則問(wèn)題可就大了,我們這些程序員只怕沒(méi)得飯吃了。
          這個(gè)就是里氏代換原則:使用父類(lèi)的地方肯定可以用它的一個(gè)子類(lèi)來(lái)替換掉,但是使用一個(gè)子類(lèi)的時(shí)候用它的父類(lèi)來(lái)替換就不一定正確了。
          好,現(xiàn)在我們回到程序設(shè)計(jì)里邊來(lái)。
          看看下面的程序:
          一個(gè)學(xué)校里邊,有兩種人:學(xué)生、老師。他們都要吃飯和睡覺(jué)。

          public interface 人{(lán)
          ??? void 吃飯();
          ??? void 睡覺(jué)();
          }
          ?
          public class 學(xué)生 implements 人{(lán)
          ??? public void 吃飯(){
          ??????? //去食堂吃飯
          ??? }
          ??? public void 睡覺(jué)(){
          ??????? //回寢室睡覺(jué)
          ??? }
          ??? ...//其他特有方法,比如泡妞、打游戲
          }
          ?
          public class 老師 implements 人{(lán)
          ??? public void 吃飯(){
          ??????? //回家吃飯
          ??? }
          ??? public void 睡覺(jué)(){
          ??????? //回家睡覺(jué)
          ??? }
          ??? ...//其它特有方法,比如為生兒育女傳宗接代的歷史使命努力等不足為外人道的事情
          }
          ?
          public class 學(xué)校{
          ??? public void 開(kāi)飯(人 ren){
          ??????? ren.吃飯();
          ??? }
          ??? public void 放學(xué)(人 ren){
          ??????? ren.睡覺(jué)();
          ??? }
          }
          ?
          這里就用到了里氏代換原則,"開(kāi)飯()"和"放學(xué)()"的參數(shù)都是人,那么這個(gè)地方如果換成學(xué)生和老師肯定也可以。
          ?
          人 a = new 學(xué)生();
          學(xué)校.開(kāi)飯(a);
          學(xué)校.放學(xué)(a);
          ?
          這樣執(zhí)行的結(jié)果就是學(xué)生回寢室吃飯。
          ?
          人 b = new 老師();
          學(xué)校.開(kāi)飯(b);
          學(xué)校.放學(xué)(b);
          ?
          這樣執(zhí)行的結(jié)果就是老師回家吃飯。
          ?
          為什么要這樣寫(xiě)呢?這樣寫(xiě)有什么好處呢?
          我在開(kāi)飯的時(shí)候完全可以直接調(diào)用"學(xué)生.吃飯();"、"老師.吃飯();"啊。
          接著看。
          有一天,學(xué)校里來(lái)了第三種人,家長(zhǎng)。
          家長(zhǎng)既不是去寢室睡覺(jué)也不是回家睡覺(jué),而是旅館睡覺(jué),既不是去食堂吃飯也不是回家吃飯,而是去下館子。
          這個(gè)時(shí)候?qū)W校這個(gè)系統(tǒng)該怎么處理呢?
          如果原來(lái)沒(méi)有定義"人"這個(gè)接口那就麻煩啦,所有用到人的地方代碼都要改。
          現(xiàn)在不一樣了,我可以直接定義一個(gè)類(lèi):家長(zhǎng),這個(gè)類(lèi)實(shí)現(xiàn)人這個(gè)接口就可以了。
          好,看代碼:
          ?
          public class 家長(zhǎng) implements 人{(lán)
          ??? public void 吃飯(){
          ??????? //下館子
          ??? }
          ??? public void 睡覺(jué)(){
          ??????? //去旅館睡覺(jué)
          ??? }
          ??? ...//其它特有方法,比如會(huì)見(jiàn)老師,曉之以錢(qián),動(dòng)之以利等等,不一而足
          }
          ?
          在調(diào)用的時(shí)候不需要修改任何代碼,還和原來(lái)一樣:
          ?
          人 c=new 家長(zhǎng)();
          學(xué)校.開(kāi)飯(c);
          學(xué)校.放學(xué)(c);
          ?
          輕松搞定家長(zhǎng)的食宿問(wèn)題!
          ?
          這樣一來(lái)學(xué)校來(lái)再多的客人都沒(méi)關(guān)系啊,絕對(duì)可以應(yīng)付自如,這也就是傳說(shuō)中的可擴(kuò)展性!
          不知道初學(xué)者看到這里是不是能夠明白接口的作用。如果你還不明白,那么你把人這個(gè)接口去掉,自己寫(xiě)一個(gè)學(xué)校開(kāi)飯和放學(xué)的類(lèi),然后再加一個(gè)家長(zhǎng)這個(gè)新新人類(lèi)進(jìn)去,看看你的代碼是什么樣子的,再想一下在人口這么多的中國(guó),萬(wàn)一哪天你的學(xué)校里來(lái)了成千上萬(wàn)個(gè)新新人類(lèi)你該怎么辦!
          posted on 2007-09-15 11:05 EricWong 閱讀(3728) 評(píng)論(21)  編輯  收藏 所屬分類(lèi): Java

          評(píng)論:
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 2007-09-17 12:41 | 中華乞丐
          謝謝 我是一個(gè)JAVA初學(xué)著,對(duì)于接口,父類(lèi),子類(lèi)很模糊,看了你的文章好象明白點(diǎn)了  回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 2007-09-20 18:17 | 點(diǎn)點(diǎn)
          贊同樓上的,好像明白了不少,很形象的例子  回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 2007-09-30 02:47 | 熊貓
          討厭JAVA呀

            回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 [未登錄](méi) 2008-01-05 22:30 | neil
          很形象的例子,多謝多謝,收獲頗豐,呵呵!!!
          還有再來(lái)滴~~~~~~  回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 [未登錄](méi) 2008-03-10 01:49 | 小馬
          恩 很不錯(cuò) 很喜歡你的文章 雖然只能看懂一些簡(jiǎn)單的 呵呵 還是謝謝了   回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 2009-04-28 21:51 | mstar
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 [未登錄](méi) 2009-07-28 21:23 | Louis
          哎 受教了,有一個(gè)大概的理解了,謝謝,話(huà)說(shuō)我還應(yīng)該看一下你的其他文章呢  回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 2009-11-05 11:14 | 耗子吳
          豁然開(kāi)朗,哈哈!比喻的好!  回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 2009-12-02 09:53 | 騷動(dòng)
          從來(lái)看帖不頂,不過(guò)這例子寫(xiě)的確實(shí)好,而且很幽默哦,
          又如生兒育女傳宗接代的歷史使命努力等不足為外人道的事情曉之以錢(qián),
          又如動(dòng)之以利等等,不一而足
          學(xué)習(xí)了??!  回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 2009-12-09 00:21 | kobe
          挺不錯(cuò)的例子,謝謝了  回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 [未登錄](méi) 2010-01-21 11:28 | 小螞蟻
          學(xué)習(xí)就該這樣,多一點(diǎn)幽默、詼諧 讓死板的代碼也活躍起來(lái)  回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 2010-04-14 14:14 | maytures
          good...  回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 2010-06-07 15:53 | dingwei
          寫(xiě)得非常好??!人才?。?nbsp; 回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 2010-11-05 16:29 | 豬滿(mǎn)天飛
          扯淡 這種問(wèn)題應(yīng)該用抽象類(lèi)  回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 2010-11-07 17:19 | 獲得法律手段
          很生動(dòng)的例子,想法很好!支持!雖然初學(xué)java,但是對(duì)這些復(fù)雜概念的理解必須要深刻才行。切記“勿在浮沙筑高臺(tái)!”。  回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 2010-11-11 21:03 | 說(shuō)明
          你說(shuō)的很表面。
          雖然感覺(jué)上是形象,但在實(shí)際應(yīng)用中,真正理解的人少。
          可以說(shuō)看過(guò)你說(shuō)的這個(gè),
          從感覺(jué)上來(lái)說(shuō),會(huì)有100%的人明白。
          但對(duì)于實(shí)際應(yīng)用中的邏輯來(lái)說(shuō),只會(huì)有10%的人明白,可能更少。

          因?yàn)橛袝r(shí)候道理大家都懂,但這個(gè)道理對(duì)我們有什么幫助卻不懂。
          這是我給你的建議。

          可以在想想,怎么才能讓理解率更高一些,作為一個(gè)老師來(lái)說(shuō),不能按自己的思維去傳授學(xué)生,應(yīng)該學(xué)會(huì)理解大眾思維,聚焦個(gè)性思維。  回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 2011-11-28 20:32 |
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 [未登錄](méi) 2013-05-11 21:11 | 可可
          不錯(cuò)  回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 2013-05-28 11:29 | 小王
          牛!我頂!  回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 [未登錄](méi) 2014-01-09 09:43 |
          碉堡了  回復(fù)  更多評(píng)論
            
          # re: 很形象的接口的使用——針對(duì)初學(xué)者 2014-03-16 11:45 | sir
          @中華乞丐
          呵呵,通俗易懂,真不錯(cuò)!  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 闸北区| 青浦区| 东宁县| 沁阳市| 东方市| 怀来县| 宜章县| 贡觉县| 玉门市| 潞城市| 治县。| 蕉岭县| 娄底市| SHOW| 司法| 白银市| 澜沧| 什邡市| 弥勒县| 万安县| 井陉县| 文化| 临武县| 台安县| 鹤庆县| 双鸭山市| 永吉县| 都江堰市| 沾益县| 多伦县| 长宁县| 出国| 武义县| 独山县| 印江| 阿巴嘎旗| 灵宝市| 肇庆市| 金堂县| 临高县| 岳池县|