<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
    數據加載中……

    接口、類、抽象類、對象的另類解釋

    本文為原創,如需轉載,請注明作者和出處,謝謝!

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

        我們也可以將類比喻成做五角星的模具。  而生產出的一個個五角星就是一個個對象。 為了建立不同的對象(有的是金屬的、有的塑料的,等等),可通過向模具里灌入不同的液態材料就可以制做。這也相當于向類的構造方法中傳入不同的參數(相當于不同的液態材料)。

        還有就是接口,如果說類是對象的抽象,那么接口就是類的抽象。
    我們也可以將接口看成是制做這個五角星模具的規格列表(相當于接口中的抽象方法)。也就是說,只有這個模具(類)符合(實現)相應的規格(接口),才會成為制做五角星的模具模具。

    哈哈,當然,這個使用模具生成五角星及其他產品的工廠可以看成是對象工廠。

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

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


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

        在面向對象理論中還有一個抽象類,這個抽象類其實就相當于一個半成品的模具。如只實現在長度和寬度(相當于在抽象類中已實現的方法),并沒有實現深度(這 個深度相當于抽象類中的抽象方法,這個抽象方法需要在抽象類的子類中實現)。所以這個模具就是半成品了。因此,是無法直接拿半成品的模具(抽象類)去生產 (實例化)產品(對象)的。





    Android開發完全講義(第2版)(本書版權已輸出到臺灣)

    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 銀河使者 閱讀(2743) 評論(9)  編輯  收藏 所屬分類: java 原創

    評論

    # re: 接口、類、抽象類、對象的另類解釋  回復  更多評論   

    不嚴謹。

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

    # re: 接口、類、抽象類、對象的另類解釋  回復  更多評論   

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

    接口:規格
    類:模具
    對象:用模具制作的產品

    一個類(模具)可以實現多個接口(規格)。一個模具可以建立多個對象(產品)。

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

    # re: 接口、類、抽象類、對象的另類解釋  回復  更多評論   

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

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

    # re: 接口、類、抽象類、對象的另類解釋  回復  更多評論   

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

    # re: 接口、類、抽象類、對象的另類解釋  回復  更多評論   

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

    至于抽象類,我認為是sun的設計師看到接口和類都有缺點。接口雖然可以強迫類必須實現接口的方法,但是如果多個類同時實現一個接口,而這個接口中的一些方法在這些類中的實現是完全一樣的。那么就會出現代碼冗余(雖然可以使用組合的方式解決,但仍會出現一定的代碼冗余)。因此,java就會為我們增加了抽象類,既可以強迫抽象類的子類實現某些方法,又可以達到代碼重用。

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

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

    總之,有了抽象類,就可以同時擁有接口和普通類的優點,而屏蔽了接口和普通類的缺點。

    注:接口的主要缺點是不能代碼重用。
    類的主要缺點是繼承一個普通類后,在創建子類實例時,父類也會創建一個實例,也就是說更耗資源,同時,也不能強迫子類必須繼承父類的某些方法。
    2008-04-27 13:56 | 銀河使者

    # re: 接口、類、抽象類、對象的另類解釋  回復  更多評論   

    至于對抽象類和接口的理解,看來我們2個中肯定有一個人是錯了。

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

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

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

    討論了半天已經偏了,但你的解釋的確夠另類的。你的文章因為登在了blogjava的閱讀提醒中,無意看見而已,并非無事找茬。如果你認為我說的哪點是不對的,歡迎指教。
    2008-04-27 14:59 | stanleyxu

    # re: 接口、類、抽象類、對象的另類解釋  回復  更多評論   

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

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

    # re: 接口、類、抽象類、對象的另類解釋  回復  更多評論   

    to stanleyxu

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

    雖然oop從總休上說可以使大規模團隊開發成為可能,但oop從某種程度上也確實增加了程序的復雜度,只是現在程序規模的增加程度遠遠超過了oop所給我們帶來的復雜程度,因此,我們感覺oop給我們帶來了方便。

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

    # re: 接口、類、抽象類、對象的另類解釋  回復  更多評論   

    我只是告訴你,你文章的比喻錯了。對類和接口的概念也有點問題。
    但你下面說的這些不知道是想干嘛。
    2008-04-29 12:42 | stanleyxu
    主站蜘蛛池模板: 亚洲s码欧洲m码吹潮| 国产a视频精品免费观看| 9420免费高清在线视频| 国产成人综合久久精品免费| 国产亚洲成AV人片在线观黄桃 | 亚洲成a人片在线观看日本麻豆 | 边摸边脱吃奶边高潮视频免费| 1000部无遮挡拍拍拍免费视频观看| 亚洲国产精品VA在线看黑人| 一个人看的免费观看日本视频www| 岛国片在线免费观看| 亚洲天堂福利视频| www视频免费看| 成年免费大片黄在线观看com| 亚洲AV中文无码乱人伦| 日本免费一区二区三区| 亚洲网址在线观看你懂的| 国产一级高青免费| 亚洲午夜久久久久久久久电影网| 一级做受视频免费是看美女| 亚洲天堂福利视频| 国产亚洲成av人片在线观看| 四虎在线播放免费永久视频 | 在线免费观看毛片网站| 免费福利电影在线观看| 亚洲卡一卡2卡三卡4卡无卡三| 国产成人免费片在线观看| 最近2019中文字幕免费直播| 无码毛片一区二区三区视频免费播放 | 免费精品国产自产拍在| 精品亚洲AV无码一区二区 | 国产a不卡片精品免费观看| 又大又硬又爽又粗又快的视频免费| 黄色一级毛片免费看| 中国亚洲呦女专区| 无码国模国产在线观看免费| 国产福利电影一区二区三区,免费久久久久久久精 | 亚洲精品无码乱码成人| 国产jizzjizz免费视频| 国国内清清草原免费视频99| 99在线免费观看视频|