[面向對象學習筆記] 封裝、抽象、繼承、多態分別可以解決那些編程問題

封裝

是什麼封裝

封裝也叫作信息隱藏或者數據訪問保護。類通過暴露有限的訪問接口,授權外部僅能通過類提供的方法來訪問內部信息或者數據。例如在Java中我們在定義一個類時,會給一個類加屬性,我們給將這些類屬性設置爲private,然後給這些屬性添加一些方法,有的只能被獲取,不能被修改,有些可以被修改,但是不可以被重置。在Java中是通過一些關鍵字來提供訪問權限控制。如果Java中沒有提供這些關鍵詞,所有的屬性默認都是public的,那麼外部的代碼都可以隨意的更改對象中屬性的值,這樣是無法達到隱藏信息和保護數據的目的,也就是無法支持封裝特性。

封裝的意義

如果我們對類中屬性的訪問不加以控制,那任何代碼都以訪問、修改類中的屬性,雖然這樣看起來更加靈活,但是靈活以爲着不可控,屬性可以隨意被修改,修改的邏輯可能散落在哥哥角落,勢必會影響代碼的可讀性、可維護性。

除此之外,類通過有效的方法暴露必要的操作,也能提高類的易用性。我們把屬性封裝起來,暴露少許的幾個不要的方法給調用者,調用者就不需要了解太多背後的業務細節,用錯的概率就減少很多。

抽象

什麼是抽象

在面向對象編程中,我們常藉助編程語言提供的接口類或者抽象類這兩種語法機制,來實現抽象這一特性。例如:在Java中,是通過interface和abstract關鍵字語法來實現。這種抽象是指把一些類的公共行爲抽象到更高的層次。

還有一種抽象是指是通過編程語言中的“函數”這一語法機制。通過函數包裹具體的實現邏輯,這本身就是一種抽象。調用者在使用函數的時候,並不需要去研究函數內部的實現邏輯,只需要通過函數的命名、註釋或者文檔,瞭解其提供了什麼功能,就可以直接使用了。比如,我們在使用C語言的malloc()函數的時候,並不需要了解它的底層代碼是怎麼樣實現。

抽象的意義

抽象以及封裝都是人類處理複雜性的有效手段。在面對複雜系統的時候,人類成熟的信息複雜程度有顯得,所以我們必須要忽略掉一些非關鍵性細節。而抽象作爲一種只關注功能點不關注實現的設計思路,能幫助我們大腦過濾到許多非需要信息。

除此之外,抽象是一個非常寬泛的設計思想,在代碼設計中,起到非常重要的指導作用。很多設計原則都體現了抽象這種設計思想。

我們在定義類的方法的時候,也要有抽象思維,不要在方法定義中,暴露太多的實現細節,以保證在某個時間點需要改變方法的實現邏輯時,不要去修改其定義。

繼承

什麼是繼承

繼承是用來表示類之間的 is-a 關係,比如貓是一中哺乳動物。在Java中使用extends來支持繼承機制。

繼承的意義

繼承最大的好處就是代碼複用。假如兩個類有一些相同的屬性和方法,我們就可以將這些相同的部分,抽取到父類中,讓兩個子類繼承父類。這樣兩個子類可以重用父類中的代碼,避免代碼複用。

繼承反應的是真實世界中的關係,它是一種 is - a關係,復符合人類的認知,而且,從設計的角度來說,也有一種結構美感。

如果過度使用繼承,會導致繼承層次過深過複雜,導致代碼可讀性、可維護性變差。爲了瞭解一個類的功能,我們需要查看很多父類的代碼。還有,子類和父類的高度耦合,修改父類的代碼,會直接影響到子類。

多態

什麼是多態

多態是指子類可以替換父類,在實際的代碼運行過程中,調用子類實現的方法。在Java中通過“繼承加方法重寫”來實現多態。

多態的意義

多態特性能夠提高代碼的可擴展和複用性。例如在Java中,使用print()函數可以打印不同類型的集合對象,如果我們想要多添加一種,只需要讓這個集合類實現接口,重寫方法即可。

除此之外,多態也是很多設計模式、設計原則、編程技巧的代碼實現基礎。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章