前文
提到,物件導向的三個特徵:封裝、繼承、多型。那麼物件導向是怎麼體現這三個特徵呢?
關於五大基本原則,個人找資料的時候看得頭都大了,對新手(如我)來說還是比較有理解難度的,本篇用較為簡單的表述來幫助理解,想先看高階版(完全版)的可以先移步:牢記物件導向五個基本原則
1. 封裝
封裝,就是將客觀事物抽象為邏輯實體,實體的屬性和功能相結合,形成乙個有機的整體。並對實體的屬性和功能實現進行訪問控制,向信任的實體開放,對不信任的實體隱藏。,通過開放的外部介面即可訪問,無需知道功能如何實現。
也就是說,封裝主要有以下目的:
舉個栗子,x怎麼跟別人介紹他的女朋友?
我的女朋友x只需要跟別人說他女朋友一些公開的屬性就行了,其他的可以選擇隱藏。
如果別人想約x跟x女朋友出來一起吃個飯,只需要向x發出邀請,而無需知道x是怎麼跟x女朋友商量的。
2. 繼承
繼承,在繼承機制下形成有層級的類,使得低層級的類可以延用高層級類的特徵和方法。繼承的實現方式有兩種:實現繼承、介面繼承。
實現繼承:直接使用基類公開的屬性和方法,無需額外編碼。
介面繼承:僅使用介面公開的屬性和方法名稱,需要子類實現。
也就是說,繼承有以下目的:
舉個栗子,怎麼樣做到年收千萬上億?繼承家產就很棒。
x爸x爸不想努力了,把公司交給x,自己的現金和銀行存款已經夠養老了。
x 繼承 x爸
3. 多型
多型,是指乙個類的同名方法,在不同情況下的實現細節不同。多型機制實現不同的內部實現結構共用同乙個外部介面。
也就是說,多型有以下目的:
舉個栗子,擁有千萬資產的x想跟女朋友結婚了。
娶親;x不想像父輩那樣專門挑個日子去領證,也不想請一堆不認識的親戚吃飯。跟未婚妻商量之後,決定這麼做。擺酒;}
x娶親 繼承 娶親;當別人在討論x是怎麼娶親的時候,可以通過娶親這個父類,來指向x娶親子類,這樣就可以知道x是怎麼娶親了。擺酒;}
從上述可以看出,多型實現的三個必要條件是:繼承、重寫(子類繼承父類後,對繼承的方法重新定義)、父類應用指向子類物件。所以,多型的實現是基於繼承的。
1. 單一職責原則(srp)
其核心思想為:乙個類,最好只做一件事,只有乙個引起它的變化。乙個類,最好有且僅有乙個引起它變化的原因。
舉個栗子,職員類裡包括了普通員工、經理、老闆,那類中勢必需要用if else來區分判斷,而且無論是這三種職員的需求發生變化,都會影響到整個職員類。
按照「單一職責原則」,將普通員工、經理、老闆分別建乙個類,既不用if else加以區分,也不會在修改某個職員類別的時候影響另乙個。
2. 開放封閉原則(ocp)
其核心思想是:軟體實體應該是可擴充套件的,而不可修改的。乙個類,可以擴充套件(新增屬性和功能),但是不要修改已經寫好的屬性和方法。
實現開開放封閉原則的核心思想就是對抽象程式設計,而不對具體程式設計,因為抽象相對穩定。打個簡單的比方,x的大舅二舅都是他舅,是有血緣關係的舅舅,如果突然冒出來乙個跟他有血緣關係的三舅,那也是他舅舅。同時也不能改變他大舅和二舅的親緣關係。
3.黎克特制替換原則(lsp)
其核心思想是:子類必須能夠替換其基類。類a是類b的父類,那麼在進行呼叫的時候,類a可以引用類b,但是反過來不行。
其實可以粗糙地理解為,類a就是對外提供乙個介面,具體的實現在類b中。
實現的方法是面向介面程式設計:將公共部分抽象為基類介面或抽象類,通過extract abstract class,在子類中通過覆寫父類的方法實現新的方式支援同樣的職責。也就是說,其實黎克特制替換原則是繼承和多型的綜合體現。
4. 依賴倒置原則(dip)
其核心思想是:依賴於抽象。具體而言就是高層模組不依賴於底層模組,二者都同依賴於抽象;抽象不依賴於具體,具體依賴於抽象。在對客觀事物抽象成邏輯實體時,可以先思考,同類事物的共性是什麼,將這個共性作為這類事物的「高層模組」,若干不同的客觀事物作為「底層模組」在依賴」高層「之後,對共性進行特定描述。
舉個栗子,蘋果跟西瓜都是水果,水果的共同屬性是水分、糖分。在這裡,」水果「作為高層模組,其屬性可以在描述「蘋果」和「西瓜」的時候使用,所以「蘋果」「西瓜」在此是「底層模組」。
5. 介面隔離原則
其核心思想是:使用多個小的專門的介面,而不要使用乙個大的總介面。介面中定義屬性和需要子類實現的方法,實現類必須完全實現介面的所有方法、屬性。為什麼要介面隔離呢?目的有二:
分離的手段主要有以下兩種:1、委託分離,通過增加乙個新的型別來委託客戶的請求,隔離客戶和介面的直接依賴,但是會增加系統的開銷。2、多重繼承分離,通過介面多繼承來實現客戶的需求,這種方式是較好的。
用文字表述出來比單純理解難多了,但在寫部落格的同時,也推進自己思考。五大基本原則作為原則,在實際應用中必定會有妥協,為他人所用,予他人便利,才是它們存在的意義。
附加:網上有很多說法是,物件導向有四個特徵:封裝、繼承、多型、抽象。為什麼小編沒有在這裡寫出來?
因為無論物件導向還是面向過程,將具體事物抽象成類,或者將問題解決過程抽象出來,這一步是少不了的。抽象已經融入到物件導向和面向過程的dna裡面了,所以個人認為,這一點是沒必要分出來的,所以也就沒寫出來了。
物件導向的三大基本特徵和五大基本原則
透切理解物件導向三大基本特性是理解物件導向五大基本原則的基礎.三大特性是 封裝,繼承,多型 所謂封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。封裝是物件導向的特徵之一,是物件和類概念的主要特性。簡單的說,乙個類就是乙個封裝了資料以...
物件導向的三大基本特徵和五大基本原則
前文提到,物件導向的三個特徵 封裝 繼承 多型。那麼物件導向是怎麼體現這三個特徵呢?關於五大基本原則,個人找資料的時候看得頭都大了,對新手 如我 來說還是比較有理解難度的,本篇用較為簡單的表述來幫助理解,想先看高階版 完全版 的可以先移步 物件導向設計的五個基本原則 1.封裝 封裝,就是將客觀事物抽...
物件導向的三大基本特徵和五大基本原則
面向過程 pop procedure oriented programming,面向過程是一種以過程為中心的程式設計思想,分析出解決問題所需的步驟,然後用函式把這些步驟實現,並按順序呼叫。它是一種基礎的順序的思維方式,物件導向方法的基礎實現中也包含面向過程思想。物件導向 oop object ori...