三個(gè)基本原則: 繼承, 封裝, 多態(tài)
五個(gè)基本原則:?單一職責(zé)原則, 開放封閉原則, 里氏替換原則, 依賴倒置原則, 接口隔離原則, 迪米特法則, 組合/聚合復(fù)用原則(五大是前五個(gè), 七大在加上后面兩個(gè))
繼承:?
繼承指的是建立一個(gè)新的派生類, 從一個(gè)或多個(gè)先定義的類中繼承數(shù)據(jù)和函數(shù), 可以重新定義或加進(jìn)新的數(shù)據(jù)和函數(shù), 從而建立了類層級(jí)或等級(jí)。繼承指的是這樣一種能力: 他可以使用現(xiàn)在類所有功能, 并在無需重新編寫原來類的情況下對(duì)這些功能進(jìn)行擴(kuò)展。
創(chuàng)建新類成為: "子類"或"派生類"
被繼承的類成為"基類"、"父類"、"超類"
繼承的過程就是從一般到特殊的過程
在某些OOP(面向?qū)ο缶幊?語言中, 一個(gè)類可以繼承多個(gè)基類, 但一般情況下, 一個(gè)類只有一個(gè)基類, 要實(shí)現(xiàn)多重繼承, 可以通過多級(jí)繼承實(shí)現(xiàn)。
繼承概念實(shí)現(xiàn)的方式有三類: 實(shí)現(xiàn)繼承、接口繼承、可視繼承
① 實(shí)現(xiàn)繼承是指使用基類的屬性和方法而無需額外編碼的能力
② 接口繼承是指僅使用屬性和方法名稱、但是子類必須提供實(shí)現(xiàn)代碼能力
③ 可視化繼承是指子窗口(類) 使用基窗口(類)的外觀和代碼實(shí)現(xiàn)功能
在使用繼承時(shí)候留意, 兩個(gè)類直接關(guān)系是屬于關(guān)系。
在OC中,一個(gè)類繼承另一個(gè)類,就是繼承了父類所有的屬性和方法,并且可以擴(kuò)充自己的屬性:而類別是在不改變?cè)蓄惖幕A(chǔ)上進(jìn)行方法擴(kuò)充。
例如: 動(dòng)物分食草動(dòng)物, 食肉動(dòng)物, 食草動(dòng)物分兔子, 羊, 牛, 食肉動(dòng)物分老虎, 獅子。這里面兔子與食草動(dòng)物就是一種繼承關(guān)系
封裝:?
把客觀的事物封裝成抽象的類, 并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作, 對(duì)不可信的類進(jìn)行信息的隱藏。簡單的說,一個(gè)類就是一個(gè)封裝了數(shù)據(jù)以及操作這些數(shù)據(jù)的代碼的邏輯實(shí)體。在一個(gè)對(duì)象內(nèi)部,某些代碼或某些數(shù)據(jù)可以是私有的,不能被外界訪問。通過這種方式,對(duì)象對(duì)內(nèi)部數(shù)據(jù)提供了不同級(jí)別的保護(hù),以防止程序中無關(guān)的部分意外的改變或錯(cuò)誤的使用了對(duì)象的私有部分。
封裝的目的是增強(qiáng)安全性和簡化編程,使用者不必了解具體的實(shí)現(xiàn)細(xì)節(jié),而只是要通過外部接口,以特定的訪問權(quán)限來使用類的成員。
例如: ?我們把兔子封裝成一個(gè)類, 兔子屬性兩只耳朵, 四條腿, 一雙眼睛, 三瓣嘴
多態(tài):?
同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力。一個(gè)實(shí)例的相同方法在不同情形有不同表現(xiàn)形式。多態(tài)機(jī)制使具有不同內(nèi)部結(jié)構(gòu)的對(duì)象可以共享相同的外部接口。這意味著,雖然針對(duì)不同對(duì)象的具體操作不同,但通過一個(gè)公共的類,它們(那些操作)可以通過相同的方式予以調(diào)用。
多態(tài)的優(yōu)點(diǎn):
1. 消除類型之間的耦合關(guān)系?
2. 可替換性?
3. 可擴(kuò)充性
4. 接口性 ?
5. 靈活性 ?
6. 簡化性
多態(tài)存在的三個(gè)必要條件:
繼承
重寫(子類繼承父類后對(duì)父類方法進(jìn)行重新定義)
父類引用指向子類對(duì)象
簡言之,多態(tài)其實(shí)是在繼承的基礎(chǔ)上的。比如說今天我們要去動(dòng)物園參觀動(dòng)物,那么你說我們?nèi)⒂^兔子、參觀羊、參觀獅子、參觀老虎對(duì)的,但你不能說我們?nèi)⒂^汽車。在這個(gè)例子中,子類具有多態(tài)性:除了使用自己的身份,還能充當(dāng)父類。
--------------------------------------------------------------------------
單一職責(zé)原則(SRP)
一個(gè)類的功能要單一,不能包羅萬象,?應(yīng)該有且只有一個(gè)去改變它的理由, 一個(gè)類應(yīng)該只有一項(xiàng)工作
比如在職員類里,將開發(fā)工程師、業(yè)務(wù)人員、分析師、售后人員等都放在職員類里考慮,其結(jié)果將會(huì)非常混亂,在這個(gè)假設(shè)下,職員類里的每個(gè)方法都要if else判斷是哪種情況,從類結(jié)構(gòu)上來說將會(huì)十分臃腫。
開放封閉原則(OCP)
一個(gè)模塊在擴(kuò)展性方面應(yīng)該是開放的而在修改性方面應(yīng)該是封閉的。對(duì)象或?qū)嶓w應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改封閉。
比如更改封閉即是在我們對(duì)模塊進(jìn)行擴(kuò)展時(shí),勿需對(duì)源有程序代碼和DLL進(jìn)行修改或重新編譯文件!這個(gè)原則對(duì)我們?cè)谠O(shè)計(jì)類的時(shí)候很有幫助,堅(jiān)持這個(gè)原則就必須盡量考慮接口封裝,抽象機(jī)制和多態(tài)技術(shù)!
里氏替換原則(LSP)
子類應(yīng)當(dāng)可以替換父類并出現(xiàn)在父類能夠出現(xiàn)的任何地方。比如:公司搞年度晚會(huì),所有員工可以參加抽獎(jiǎng),那么不管是老員工還是新員工,總部員工還是外派員工,都應(yīng)當(dāng)可以參加抽獎(jiǎng),否則這公司就不和諧了。
依賴倒置原則(DIP)
高層次的模塊不應(yīng)該依賴于低層次的模塊,他們都應(yīng)該依賴于抽象。具體實(shí)現(xiàn)應(yīng)該依賴于抽象,而不是抽象依賴于實(shí)現(xiàn)。
可以這樣理解,上面我舉例子的時(shí)候先說了兔子和羊,然后才推出食草動(dòng)物。但如果我們繼續(xù)認(rèn)識(shí)了牛、馬等食草動(dòng)物,我們會(huì)發(fā)現(xiàn)我們需要不斷調(diào)整食草動(dòng)物的描述,這樣程序會(huì)變得僵化,所以我們不應(yīng)該讓子類依賴于實(shí)體,不應(yīng)該讓父類模塊依賴于子類模塊。所以我們需要將食草動(dòng)物設(shè)計(jì)為抽象類,即抽象類或接口。這樣下層只需要實(shí)現(xiàn)相應(yīng)的細(xì)節(jié)而不會(huì)影響父類。
接口隔離原則(ISP)
模塊間要通過抽象接口隔離開,而不是通過具體的類強(qiáng)耦合起來??蛻舳瞬粦?yīng)該依賴它不需要的接口。一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該建立在最小的接口上。
比如,為了減少接口的定義,將許多類似的方法都放在一個(gè)接口中,最后會(huì)發(fā)現(xiàn),維護(hù)和實(shí)現(xiàn)接口的時(shí)候花了太多精力,而接口所定義的操作相當(dāng)于對(duì)客戶端的一種承諾,這種承諾當(dāng)然是越少越好,越精練越好,過多的承諾帶來的就是你的大量精力和時(shí)間去維護(hù)!
參考1:?https://www.cnblogs.com/xiesong/p/10399273.html
參考2:?https://www.cnblogs.com/fzz9/p/8973315.html#%E3%80%80%E3%80%803多態(tài)