讀TIJ -7 多型

來源:互聯網
上載者:User

標籤:style   blog   http   java   color   使用   

《Think in java·第 7 章  多型》

【物件導向的程式設計語言三種最基本的特徵:資料抽象、繼承和多態】

在這個層面是沒有什麼“思想”好談的!當你按照人們熟悉的、習慣的思維方式,去思考“構造和組織”程式時,你可能會覺得很自然——你具有物件導向的思想;或者,有人X按照人們熟悉的、習慣的(人的而非機器的)思維方式,給你介紹、解釋資料抽象、繼承和多態時,你覺得貼近生活和人的思考習慣、你覺得他講的概念理所當然、自然(當然也淺顯易懂),這是X在“思想”指導下對物件導向進行解釋。物件導向的思想、物件導向範式需要從托馬斯?庫恩的範式(paradigm)論、物件導向設計的各種原則和軟體工程原則中獲得,通常這是作者的事情。

本章中,作者希望講述的是其實是【p148 抽象類別和Java介面在程式設計中的重要作用。在代碼中要儘可能地使用(依賴)抽象類別型,而非具體類。】,但是他沒有根據OCP、“針對介面編程”展開,而是以多態這個術語為根據地而四處遊擊,給我的感覺有些隔靴搔癢。

所以,第一段【“多型”(Polymorphism)從另一個角度將介面從具體的實施細節中分離出來,亦即實現了“是什麼”與“怎樣做”兩個模組的分離。利用多型的概念,代碼的組織以及可讀性均能獲得改善。此外,還能建立“易於擴充”的程式。無論在項目的建立過程中,還是在需要加入新特性的時候,它們都可以方便地“成長”。】

你最好把文中的多型,替換成抽象類別型(Java中的抽象類別和Java介面)——如果不那麼理論苛求的話,用父類型(較大的適用面的類型)也可,即:

抽象類別型(父類型)從另一個角度將介面從具體的實施細節中分離出來,亦即實現了“是什麼”與“怎樣做”兩個模組的分離。利用抽象類別型,代碼的組織以及可讀性均能獲得改善。此外,還能建立“易於擴充”的程式。無論在項目的建立過程中,還是在需要加入新特性的時候,它們都可以方便地“成長”

多態,handle(A xx),對於客戶程式,A是其各種各樣子類的預留位置。父類——通常是抽象類別型,把它的子類們歸結成同一個概念,在程式中以一個名詞來看待它的所有子類,從而屏蔽子類的具體類型。父類、抽象類別型的作用正是通過多態而體現。

7.1  上溯造型

把一個子類引用賦值給父類的引用變數,稱為向上造型(upcasting)。如

Sup s = new Sub();  // Sup為父類

doSth(Sup s) 調用語句  doSth(new Sub()) 

7.1.1  為什麼要上溯造型  要我說的話:“編程時,doSth(Sup s)等都是針對父類型Sup(假設Sup是動物) 編寫的,那麼你的Sub是貓、狗和馬都被統一處理。要統一處理,就要向上造型。”我不喜歡作者的寫法,至少我看這一節時,我按照他的文字【這個程式看起來也許顯得有些奇怪。為什麼所有人都應該有意忘記一個對象的類型呢?……】搞半天,就是用福爾摩斯的方式敘述一個極其自然的事情,而且還給出一個看似很厲害其實很無聊的例子——還是反面例子,最後,才說【但假如唯寫一個方法,將基礎類作為自變數或參數使用,而不是使用那些特定的衍生類,豈不是會簡單得多?也就是說,如果我們能不顧衍生類,只讓自己的代碼與基礎類打交道,那麼省下的工作量將是難以估計的。】。

7.2  深入理解 7.2.1  動態綁定 
7.2.2  產生正確的行為   參考:什麼是多態(polymorphism)
7.2.3  擴充性 還是上面的話,編程時,doSth(Sup s)等都是針對父類型Sup(假設Sup是動物) 編寫的,那麼你的Sub出現了新的動物,如羊、雞……【可根據自己的需要向系統裡加入任意多的新類型……這樣的程式具有“擴充性】

【假設我們在基礎類裡加入更多的方法,以及一系列新類,那麼會出現什麼情況呢?】類圖、代碼和【可以看到,在圍繞 tune()方法的其他所有代碼都發生變化的同時,tune()方法卻絲毫不受它們的影響,依然故我地正常工作。這正是利用多型希望達到的目標。我們對代碼進行修改後,不會對程式中不應受到影響的部分造成影響。此外,我們認為多型是一種至關重要的技術,它允許程式員“將發生改變的東西同沒有發生改變的東西區分開”。】我 完全不理解這一段想說什麼。
public static void doSth(Sup s) {// ...s.m();}
在上面的代碼的條件下,doSth(Sup s)統一處理Sup的各種各樣的子類,而doSth(Sup s)僅僅涉及Sup的介面m()。 假設Sup沒有子類,它有介面m1()、m2(),你刪除了m1()、m2()對doSth(Sup s)有影響嗎?你添加Sup的介面m8()、m9()對doSth(Sup s)有影響嗎? 不考慮多型也沒有任何影響,這個“不受影響”與多態有一毛錢的關係?是不是要告訴我們一個真理:不會對程式中 不會受到影響的部分造成影響。
7.3  覆蓋與過載

這個例子...

7.4  抽象類別和方法7.5  介面

翻譯啊,3rd中An interface can also contain fields, but these are implicitly static and final. ,我不相信會出現導致“介面也包含了基礎資料型別 (Elementary Data Type)的資料成員,但它們都預設為 static 和 final”這種結果的原文。

我不喜歡“將其想象為一個“純”抽象類別”、構造器是特殊的方法 這樣的話。

7.5.1 Java 的“多重繼承” 

7.5.2  通過繼承擴充介面 子介面

7.5.3  常數分組 “介面是對常數值進行分組的一個好工具”,不是好主意。

7.5.4  初始化介面中的欄位 用隨機數來初始化。

7.6  內部類我在介紹【9.3 事件驅動編程】特別是回調之後才介紹9.4巢狀型別。匿名類是Java實現回調的基本方式,也是Java引入巢狀型別的主要原因,而現在有了λ運算式。先跳過本節,要好好思考一下這部分應該怎樣處理。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.