前文提到,面向對象的三個特徵:封裝、繼承、多態。那麼面向對象是怎麼體現這三個特徵呢?編程
關於五大基本原則,我的找資料的時候看得頭都大了,對新手(如我)來講仍是比較有理解難度的,本篇用較爲簡單的表述來幫助理解,想先看進階版(徹底版)的能夠先移步:牢記面向對象五個基本原則安全
封裝,就是將客觀事物抽象爲邏輯實體,實體的屬性和功能相結合,造成一個有機的總體。並對實體的屬性和功能實現進行訪問控制,向信任的實體開放,對不信任的實體隱藏。,經過開放的外部接口便可訪問,無需知道功能如何實現。框架
也就是說,封裝主要有如下目的:編碼
舉個栗子,X怎麼跟別人介紹他的女友?.net
個人女友{ 屬性: 姓名; (體重等信息就不必跟別人說了,隱藏起來) 行爲: 吃飯; (其餘的別人也不須要知道,隱藏起來) }
X只須要跟別人說他女友一些公開的屬性就好了,其餘的能夠選擇隱藏。code
若是別人想約X跟X女友出來一塊兒吃個飯,只須要向X發出邀請,而無需知道X是怎麼跟X女友商量的。對象
繼承,在繼承機制下造成有層級的類,使得低層級的類能夠延用高層級類的特徵和方法。繼承的實現方式有兩種:實現繼承、接口繼承。blog
實現繼承:直接使用基類公開的屬性和方法,無需額外編碼。繼承
接口繼承:僅使用接口公開的屬性和方法名稱,須要子類實現。接口
也就是說,繼承有如下目的:
舉個栗子,怎麼樣作到年收千萬上億?繼承家產就很棒。
X爸{ 屬性: 股票; (現金和銀行存款做爲養老資產,隱藏起來) 行爲: 管理公司; }
X爸不想努力了,把公司交給X,本身的現金和銀行存款已經夠養老了。
X 繼承 X爸{ 屬性: 股票; (本身的現金和銀行存款,隱藏起來) 行爲: 管理公司; }
多態,是指一個類的同名方法,在不一樣狀況下的實現細節不一樣。多態機制實現不一樣的內部實現結構共用同一個外部接口。
也就是說,多態有如下目的:
舉個栗子,擁有千萬資產的X想跟女友結婚了。
娶親{ 行爲: 領證{挑個黃道吉日去領證}; 擺酒{宴請各路親戚三頓飯}; }
X不想像父輩那樣專門挑個日子去領證,也不想請一堆不認識的親戚吃飯。跟未婚妻商量以後,決定這麼作。
X娶親 繼承 娶親{ 行爲: 領證{跟未婚妻飯後散步,順便領證}; 擺酒{僅僅是宴請親人和兩人各自最好的幾個朋友}; }
當別人在討論X是怎麼娶親的時候,能夠經過娶親這個父類,來指向X娶親子類,這樣就能夠知道X是怎麼娶親了。
從上述能夠看出,多態實現的三個必要條件是:繼承、重寫(子類繼承父類後,對繼承的方法從新定義)、父類應用指向子類對象。因此,多態的實現是基於繼承的。
其核心思想爲:一個類,最好只作一件事,只有一個引發它的變化。
一個類,最好有且僅有一個引發它變化的緣由。
舉個栗子,職員類裏包括了普通員工、經理、老闆,那類中勢必須要用if else來區分判斷,並且不管是這三種職員的需求發生變化,都會影響到整個職員類。
按照「單一職責原則」,將普通員工、經理、老闆分別建一個類,既不用if else加以區分,也不會在修改某個職員類別的時候影響另外一個。
其核心思想是:軟件實體應該是可擴展的,而不可修改的。
一個類,能夠擴展(添加屬性和功能),可是不要修改已經寫好的屬性和方法。
實現開開放封閉原則的核心思想就是對抽象編程,而不對具體編程,由於抽象相對穩定。
打個簡單的比方,X的大舅二舅都是他舅,是有血緣關係的舅舅,若是忽然冒出來一個跟他有血緣關係的三舅,那也是他舅舅。同時也不能改變他大舅和二舅的親緣關係。
其核心思想是:子類必須可以替換其基類。
類A是類B的父類,那麼在進行調用的時候,類A能夠引用類B,可是反過來不行。
其實能夠粗糙地理解爲,類A就是對外提供一個接口,具體的實如今類B中。
實現的方法是面向接口編程:將公共部分抽象爲基類接口或抽象類,經過Extract Abstract Class,在子類中經過覆寫父類的方法實現新的方式支持一樣的職責。
也就是說,其實里氏替換原則是繼承和多態的綜合體現。
其核心思想是:依賴於抽象。具體而言就是高層模塊不依賴於底層模塊,兩者都同依賴於抽象;抽象不依賴於具體,具體依賴於抽象。
在對客觀事物抽象成邏輯實體時,能夠先思考,同類事物的共性是什麼,將這個共性做爲這類事物的「高層模塊」,若干不一樣的客觀事物做爲「底層模塊」在依賴」高層「以後,對共性進行特定描述。
舉個栗子,蘋果跟西瓜都是水果,水果的共同屬性是水分、糖分。在這裏,」水果「做爲高層模塊,其屬性能夠在描述「蘋果」和「西瓜」的時候使用,因此「蘋果」「西瓜」在此是「底層模塊」。
其核心思想是:使用多個小的專門的接口,而不要使用一個大的總接口。
接口中定義屬性和須要子類實現的方法,實現類必須徹底實現接口的全部方法、屬性。爲何要接口隔離呢?目的有二:
分離的手段主要有如下兩種:一、委託分離,經過增長一個新的類型來委託客戶的請求,隔離客戶和接口的直接依賴,可是會增長系統的開銷。二、多重繼承分離,經過接口多繼承來實現客戶的需求,這種方式是較好的。
用文字表述出來比單純理解難多了,但在寫博客的同時,也推動本身思考。五大基本原則做爲原則,在實際應用中一定會有妥協,爲他人所用,予他人便利,纔是它們存在的意義。
附加(03-05):
網上有不少說法是,面向對象有四個特徵:封裝、繼承、多態、抽象。爲何小編沒有在這裏寫出來?
由於不管面向對象仍是面向過程,將具體事物抽象成類,或者將問題解決過程抽象出來,這一步是少不了的。抽象已經融入到面向對象和麪向過程的DNA裏面了,因此我的認爲,這一點是不必分出來的,因此也就沒寫出來了。