隨筆 - 312, 文章 - 14, 評(píng)論 - 1393, 引用 - 0
          數(shù)據(jù)加載中……

          接口、類、抽象類、對(duì)象的另類解釋

          本文為原創(chuàng),如需轉(zhuǎn)載,請(qǐng)注明作者和出處,謝謝!

              大家也許都知道做工藝器或是工廠里做生產(chǎn)某些產(chǎn)品的模具模具。如做一個(gè)金屬的五角星,只要將鋼水罐到五角星的模具模具里就可以很容易地制做五角星。

              我們也可以將類比喻成做五角星的模具。  而生產(chǎn)出的一個(gè)個(gè)五角星就是一個(gè)個(gè)對(duì)象。 為了建立不同的對(duì)象(有的是金屬的、有的塑料的,等等),可通過向模具里灌入不同的液態(tài)材料就可以制做。這也相當(dāng)于向類的構(gòu)造方法中傳入不同的參數(shù)(相當(dāng)于不同的液態(tài)材料)。

              還有就是接口,如果說類是對(duì)象的抽象,那么接口就是類的抽象。
          我們也可以將接口看成是制做這個(gè)五角星模具的規(guī)格列表(相當(dāng)于接口中的抽象方法)。也就是說,只有這個(gè)模具(類)符合(實(shí)現(xiàn))相應(yīng)的規(guī)格(接口),才會(huì)成為制做五角星的模具模具。

          哈哈,當(dāng)然,這個(gè)使用模具生成五角星及其他產(chǎn)品的工廠可以看成是對(duì)象工廠。

          class ObjectFactory
          {
              
          public static 五解星 create五角星() {}
             
              
          public static 圓 create圓() {}

                
          public static 橢圓 create橢圓() {}
              
          }


              也就是說,類和接口都不是實(shí)際的產(chǎn)品,都不能拿來(lái)用,類相當(dāng)于模具(沒人會(huì)拿模具模具在商店里賣吧,估計(jì)只有對(duì)象工廠會(huì)買),而接口只相當(dāng)于制做模具的規(guī) 格列表,如尺寸、角度等。而這些規(guī)格列表的內(nèi)容需要在具體類中實(shí)現(xiàn)才可能成為具體的模具,如長(zhǎng)度和寬度,如果在類中實(shí)現(xiàn)為長(zhǎng)度等于寬度,那么這個(gè)類就成為 一個(gè)成方形的模具,如果長(zhǎng)度不等于寬度,就是一個(gè)長(zhǎng)方形的模具。然后再實(shí)例化這個(gè)模具(類),就生成出一個(gè)個(gè)正方形或長(zhǎng)方形對(duì)象。

              在面向?qū)ο罄碚撝羞€有一個(gè)抽象類,這個(gè)抽象類其實(shí)就相當(dāng)于一個(gè)半成品的模具。如只實(shí)現(xiàn)在長(zhǎng)度和寬度(相當(dāng)于在抽象類中已實(shí)現(xiàn)的方法),并沒有實(shí)現(xiàn)深度(這 個(gè)深度相當(dāng)于抽象類中的抽象方法,這個(gè)抽象方法需要在抽象類的子類中實(shí)現(xiàn))。所以這個(gè)模具就是半成品了。因此,是無(wú)法直接拿半成品的模具(抽象類)去生產(chǎn) (實(shí)例化)產(chǎn)品(對(duì)象)的。





          Android開發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺(tái)灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2008-04-27 09:50 銀河使者 閱讀(2752) 評(píng)論(9)  編輯  收藏 所屬分類: java 原創(chuàng)

          評(píng)論

          # re: 接口、類、抽象類、對(duì)象的另類解釋  回復(fù)  更多評(píng)論   

          不嚴(yán)謹(jǐn)。

          一個(gè)類可以有多個(gè)接口,如果接口是規(guī)格,那么一個(gè)類豈不是有多個(gè)規(guī)格?規(guī)格比喻成類更合適。
          類是個(gè)定義,是生產(chǎn)之前的東西,只有實(shí)例化之后才是實(shí)實(shí)在在的東西。真的可以可以比喻成模具的是工廠類的生產(chǎn)方式。
          2008-04-27 10:52 | stanleyxu

          # re: 接口、類、抽象類、對(duì)象的另類解釋  回復(fù)  更多評(píng)論   

          一個(gè)類當(dāng)然可以有多個(gè)規(guī)格。就象一個(gè)模具,如五角星,當(dāng)然可以有多個(gè)規(guī)格(如角度不同,五角星也有很多變了型的,哈哈),

          接口:規(guī)格
          類:模具
          對(duì)象:用模具制作的產(chǎn)品

          一個(gè)類(模具)可以實(shí)現(xiàn)多個(gè)接口(規(guī)格)。一個(gè)模具可以建立多個(gè)對(duì)象(產(chǎn)品)。

          2008-04-27 11:04 | 銀河使者

          # re: 接口、類、抽象類、對(duì)象的另類解釋  回復(fù)  更多評(píng)論   

          接口不是oop的一部分,是后來(lái)才有的。它和抽象類有點(diǎn)類似,所以經(jīng)常放在一起比較。我對(duì)此文的不少解釋不敢茍同。
          1. 對(duì)象是原子類,你想說的對(duì)象,我認(rèn)作為實(shí)例。如果你去看java的文檔,里面寫的很清楚:Class Object is the root of the class hierarchy.
          2. 接口如我所說,不是oop的一部分,他是不需要繼承機(jī)制的。也就是說,任何2個(gè)不相關(guān)的類,可以擁有同樣的一個(gè)接口。這個(gè)你可以解釋成:任何2個(gè)不同的模具都擁有一樣的規(guī)格?

          如果按照我的說法:
          接口是特殊設(shè)計(jì)要求,抽象類是設(shè)計(jì)方案模板,類是具體設(shè)計(jì)方案,實(shí)例是成品。
          那么一個(gè)產(chǎn)品的設(shè)計(jì)方案可以是由具體設(shè)計(jì)方案而來(lái)。(一個(gè)類可以是從抽象類繼承)
          一個(gè)設(shè)計(jì)方案可能需要符合多個(gè)特殊設(shè)計(jì)要求。(一個(gè)類可以擁有0..n個(gè)接口)
          只有通過具體設(shè)計(jì)方案才可以生產(chǎn)成品,而不能根據(jù)方案模板或者一個(gè)特殊設(shè)計(jì)要求進(jìn)行制造。(一個(gè)實(shí)例是通過類創(chuàng)建,而不是直接從一個(gè)抽象類或者接口創(chuàng)建)
          2008-04-27 11:51 | stanleyxu

          # re: 接口、類、抽象類、對(duì)象的另類解釋  回復(fù)  更多評(píng)論   

          更正上一個(gè)評(píng)論:
          一個(gè)產(chǎn)品的設(shè)計(jì)方案可能是根據(jù)某個(gè)設(shè)計(jì)方案模板修改而來(lái)。(一個(gè)類可以是從抽象類繼承)
          一個(gè)(具體)設(shè)計(jì)方案可能需要符合多個(gè)特殊設(shè)計(jì)要求。(一個(gè)(抽象)類可以擁有0..n個(gè)接口)
          只有通過具體設(shè)計(jì)方案才可以生產(chǎn)成品,而不能根據(jù)一個(gè)方案模板或者一個(gè)特殊設(shè)計(jì)要求直接進(jìn)行制造。(一個(gè)實(shí)例是通過類創(chuàng)建,而不是直接從一個(gè)抽象類或者接口創(chuàng)建)
          2008-04-27 12:00 | stanleyxu

          # re: 接口、類、抽象類、對(duì)象的另類解釋  回復(fù)  更多評(píng)論   

          總之,先有的類,然后再有的接口,接口主要是為了制定規(guī)范而存在的。如在團(tuán)隊(duì)開發(fā)過程中,設(shè)計(jì)師可以會(huì)設(shè)計(jì)一系列的接口,然后所有的開發(fā)人員在開發(fā)component時(shí),都會(huì)遵循這些接口。這樣就可以盡量避免設(shè)計(jì)和實(shí)現(xiàn)沖突。
          就象servlet、jsp、ejb的規(guī)范都是由接口(也有抽象類)組成的。

          至于抽象類,我認(rèn)為是sun的設(shè)計(jì)師看到接口和類都有缺點(diǎn)。接口雖然可以強(qiáng)迫類必須實(shí)現(xiàn)接口的方法,但是如果多個(gè)類同時(shí)實(shí)現(xiàn)一個(gè)接口,而這個(gè)接口中的一些方法在這些類中的實(shí)現(xiàn)是完全一樣的。那么就會(huì)出現(xiàn)代碼冗余(雖然可以使用組合的方式解決,但仍會(huì)出現(xiàn)一定的代碼冗余)。因此,java就會(huì)為我們?cè)黾恿顺橄箢悾瓤梢詮?qiáng)迫抽象類的子類實(shí)現(xiàn)某些方法,又可以達(dá)到代碼重用。

          因此,也可以這么說。所有的方法都是抽象方法的抽象類就是接口,所有的方法都是普通方法的抽象類就相當(dāng)于普通類(雖然不能創(chuàng)建抽象類的實(shí)例)

          就象一個(gè)劃桿,左邊代表抽象,右邊代表具體。如果劃到最左邊,就是接口,劃到最右邊,就相當(dāng)于普通類(除了不能創(chuàng)建實(shí)例,其他的和普通類完全一樣)。

          總之,有了抽象類,就可以同時(shí)擁有接口和普通類的優(yōu)點(diǎn),而屏蔽了接口和普通類的缺點(diǎn)。

          注:接口的主要缺點(diǎn)是不能代碼重用。
          類的主要缺點(diǎn)是繼承一個(gè)普通類后,在創(chuàng)建子類實(shí)例時(shí),父類也會(huì)創(chuàng)建一個(gè)實(shí)例,也就是說更耗資源,同時(shí),也不能強(qiáng)迫子類必須繼承父類的某些方法。
          2008-04-27 13:56 | 銀河使者

          # re: 接口、類、抽象類、對(duì)象的另類解釋  回復(fù)  更多評(píng)論   

          至于對(duì)抽象類和接口的理解,看來(lái)我們2個(gè)中肯定有一個(gè)人是錯(cuò)了。

          1:類、抽象類都是oop的概念,而接口是后于oop的產(chǎn)物。不是說抽象類比普通類+接口更有優(yōu)勢(shì)。恰恰相反的是,抽象類雖然提供了代碼重用,但是僅限于同一個(gè)類的繼承構(gòu)架(class hierarchy),/為了突破繼承構(gòu)架的束縛/才引入了接口的概念。

          2:接口雖然像是萬(wàn)能膠,可以定義到任何類中,但代價(jià)是:代碼必須獨(dú)立實(shí)現(xiàn),哪怕它們的實(shí)現(xiàn)代碼完全一致。(當(dāng)然如果代碼完全一致,還是有辦法可以重用的) 至于什么時(shí)候用接口和什么時(shí)候用繼承類也是根據(jù)情況而定。(它們各有優(yōu)缺點(diǎn),網(wǎng)上查吧,一堆呢) 但是要記住!接口在一定成都上破壞了oop,把無(wú)關(guān)東西關(guān)聯(lián)起來(lái)了。

          3:至于說類的層層繼承構(gòu)架耗資源,如果你為了省資源要打破oop,那是你的事情了。沒人說你必須或者不可以這樣做。

          討論了半天已經(jīng)偏了,但你的解釋的確夠另類的。你的文章因?yàn)榈窃诹薭logjava的閱讀提醒中,無(wú)意看見而已,并非無(wú)事找茬。如果你認(rèn)為我說的哪點(diǎn)是不對(duì)的,歡迎指教。
          2008-04-27 14:59 | stanleyxu

          # re: 接口、類、抽象類、對(duì)象的另類解釋  回復(fù)  更多評(píng)論   

          哈哈,任何東西都有缺點(diǎn),抽象類也類例外。不能多繼承是目前大多數(shù)面象對(duì)象語(yǔ)言都存在的問題,有利必有弊。但總體上是平衡的。最好是根據(jù)具體的需要使用接口、抽象類或普通類,以及它們的任意組合。沒有絕對(duì)的好壞之分。只要能滿足要求,就是正確的選擇。
          本文的目的并不是深究這些東東哪個(gè)更好,哪個(gè)不好。只是在itpub上有人不太明白接口、類、抽象類之間的關(guān)系,這是我的一個(gè)回答,希望對(duì)初學(xué)者有一些幫助。至于如何應(yīng)用它們才更好,并不是本文要討論的范圍。
          不過我衷心希望各位高手可以將自己的設(shè)計(jì)思想和設(shè)計(jì)理念共享出來(lái),以便和大家分享。謝謝!

          2008-04-27 15:12 | 銀河使者

          # re: 接口、類、抽象類、對(duì)象的另類解釋  回復(fù)  更多評(píng)論   

          to stanleyxu

          你說接口破壞了oop的規(guī)則。在我看來(lái),先不管接口是否打破了oop。單就oop本身來(lái)說,它的存在并不是讓我們非得使用它,換句話說,我們不能為了使用oop而使用oop,就象有很多java framework,我們也不能為了使用它們而使用它們。

          雖然oop從總休上說可以使大規(guī)模團(tuán)隊(duì)開發(fā)成為可能,但oop從某種程度上也確實(shí)增加了程序的復(fù)雜度,只是現(xiàn)在程序規(guī)模的增加程度遠(yuǎn)遠(yuǎn)超過了oop所給我們帶來(lái)的復(fù)雜程度,因此,我們感覺oop給我們帶來(lái)了方便。

          但如果各位讀過按著oop思想的編寫的源代碼。就會(huì)感覺到,讀起來(lái),要遠(yuǎn)比過程語(yǔ)言更難閱讀。當(dāng)然,我承認(rèn)有更好的讀oop源代碼的方法,但oop也確實(shí)正在使這個(gè)世界變得更復(fù)雜。哈哈,這個(gè)世界本來(lái)就很復(fù)雜!!多留戀當(dāng)初的匯編和C語(yǔ)言時(shí)代啊!沒有這么多概念,一切都是tech-to-tech。不過社會(huì)在發(fā)展,當(dāng)然,編程思想也得與時(shí)俱進(jìn)。但愿將來(lái)出個(gè)比oop更好的編程方式或技術(shù)。最好由計(jì)算機(jī)自己去編程,那樣程序員就可以一邊喝咖啡,一邊看著自己喜歡的video。盡情地享受生活。 是不是有些象科幻啊! 我就用火箭之父齊奧爾科夫斯基話過的一句話結(jié)尾吧:昨天的夢(mèng)想就是今天的希望,更是明天的現(xiàn)實(shí)。 但愿每個(gè)人天天做好夢(mèng),而且夢(mèng)想成真!
          2008-04-27 15:34 | 銀河使者

          # re: 接口、類、抽象類、對(duì)象的另類解釋  回復(fù)  更多評(píng)論   

          我只是告訴你,你文章的比喻錯(cuò)了。對(duì)類和接口的概念也有點(diǎn)問題。
          但你下面說的這些不知道是想干嘛。
          2008-04-29 12:42 | stanleyxu
          主站蜘蛛池模板: 遂昌县| 抚顺市| 张家界市| 泰顺县| 阿勒泰市| 许昌县| 茌平县| 白水县| 山东省| 民县| 旬阳县| 承德市| 潞西市| 阿拉善右旗| 云南省| 靖宇县| 霍林郭勒市| 闽清县| 临泉县| 鸡泽县| 蓝田县| 夏津县| 乌苏市| 安多县| 禹州市| 富蕴县| 平果县| 山阴县| 泸水县| 东乡| 富平县| 壶关县| 茶陵县| 乌鲁木齐县| 金门县| 梁河县| 炉霍县| 清徐县| 化隆| 延川县| 高台县|