談談關(guān)于組合和繼承

組合大于繼承(Composition over Inheritance)肠牲?這是一個問題幼衰。

繼承是一個縱向的擴展,組合是一個橫向的擴展缀雳。

繼承是從代碼復用的角度來說的渡嚣。但是繼承并不直接等同于代碼復用,如果一開始只是出于代碼復用的目的而不區(qū)分類別和場景,就采用繼承是不恰當?shù)摹?/p>

代碼復用還可以使用組合的方式识椰,比如前端的React框架有著一套極為強大的組合機制绝葡,官方也強烈建議使用組合的方式來應用React。

就大部分開發(fā)任務來說腹鹉,其實繼承出現(xiàn)的場景不多藏畅,主要還是代碼復用的場景比較多,然而如果通過組合去進行代碼復用又會顯得比較麻煩功咒。

從維護成本來看愉阎,組合其實會更好——因為不恰當?shù)厥褂美^承會導致高耦合:從而破壞封裝,子類依賴于父類的實現(xiàn)力奋,子類缺乏獨立性榜旦。如果有人不小心改動了父類,就會牽一發(fā)而動全身刊侯,所有涉及到的子類的功能都有可能產(chǎn)生問題章办。

同時繼承還會帶來并不需要的屬性或者行為方法。怎么辦滨彻?要么覆寫藕届、要么換一個父類繼承(這個方式貌似會導致出現(xiàn)其他的并不需要的屬性或者行為方法ORZ...)。

覆寫同樣會導致問題亭饵,比如A是B的父類休偶,他有一個屬性嘴巴,這個嘴巴有一個說話和吃飯的功能辜羊,B繼承了它踏兜,但是B不需要會說話,它吃飯就行了——于是它覆寫了——這將可能導致其他繼承自A的子類都變成啞巴八秃。

一般如果硬要使用繼承來使用的話碱妆,更通用的方法是,寫一個基類昔驱,重寫方法疹尾,然后更改一堆繼承關(guān)系,還是很麻煩啊骤肛。

所以繼承得遵循LSP(里氏替換原則):子類可以擴展父類的功能纳本,但不能改變父類原有的功能。

它包含以下4層含義:

1. 子類可以實現(xiàn)父類的抽象方法腋颠,但不能覆蓋父類的非抽象方法繁成。

2. 子類中可以增加自己特有的方法。

3. 當子類的方法重載父類的方法時淑玫,方法的前置條件(即方法的形參)要比父類方法的輸入?yún)?shù)更寬松巾腕。

4. 當子類的方法實現(xiàn)父類的抽象方法時面睛,方法的后置條件(即方法的返回值)要比父類更嚴格。

提到組合就出現(xiàn)了另一個原則——CARP(合成/聚合復用原則):

合成/聚合復用原則(Composite/Aggregate Reuse Principle或CARP)經(jīng)常又叫做合成復用原(Composite Reuse Principle或CRP)祠墅,就是在一個新的對象里面使用一些已有的對象侮穿,使之成為新對象的一部分;新對象通過向這些對象的委派達到復用已有功能的目的毁嗦。

React框架強烈建議組合亲茅,并以函數(shù)式編程單一功能原則——一個函數(shù)或者說組件只實現(xiàn)一個功能。那么這里也就出現(xiàn)了——使用組合的方式可能會比使用繼承寫更多的代碼狗准。

因為組合的問題是:

1. 整體類不能自動獲得和局部類同樣的接口克锣。

2. 創(chuàng)建整體類的對象時,需要創(chuàng)建所有局部類的對象(或者說組合所有的局部類)腔长。

綜上袭祟,使用組合和繼承應該遵循以下幾個條件:

1. 精心設(shè)計專門用于被繼承的類,繼承樹的抽象層應該比較穩(wěn)定捞附,一般不要多于三層巾乳;

2. 對于不是專門用于被繼承的類,禁止其被繼承鸟召;

3. 優(yōu)先考慮用組合關(guān)系來提高代碼的可重用性胆绊;

4. 子類是一種特殊的類型,而不只是父類的一個角色欧募;

5. 子類擴展压状,而不是覆蓋或者使父類的功能失效。

或許用面向接口編程的設(shè)計思想能比較好的解決繼承導致的高耦合的問題(注意:面向接口編程和面向?qū)ο缶幊滩⒉皇瞧郊壍母蹋⒉皇潜让嫦驅(qū)ο缶幊谈冗M的一種獨立的編程思想种冬,而是附屬于面向?qū)ο笏枷塍w系,屬于其一部分舔糖∮榱剑或者說,它是面向?qū)ο缶幊腆w系中的思想精髓之一金吗。)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谷婆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辽聊,更是在濱河造成了極大的恐慌,老刑警劉巖期贫,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跟匆,死亡現(xiàn)場離奇詭異,居然都是意外死亡通砍,警方通過查閱死者的電腦和手機玛臂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門烤蜕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人迹冤,你說我怎么就攤上這事讽营。” “怎么了泡徙?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵橱鹏,是天一觀的道長。 經(jīng)常有香客問我堪藐,道長莉兰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任礁竞,我火速辦了婚禮糖荒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘模捂。我一直安慰自己捶朵,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布狂男。 她就那樣靜靜地躺著综看,像睡著了一般。 火紅的嫁衣襯著肌膚如雪并淋。 梳的紋絲不亂的頭發(fā)上寓搬,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音县耽,去河邊找鬼句喷。 笑死,一個胖子當著我的面吹牛兔毙,可吹牛的內(nèi)容都是我干的唾琼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼澎剥,長吁一口氣:“原來是場噩夢啊……” “哼锡溯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哑姚,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤祭饭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叙量,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倡蝙,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年绞佩,在試婚紗的時候發(fā)現(xiàn)自己被綠了寺鸥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猪钮。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胆建,靈堂內(nèi)的尸體忽然破棺而出烤低,到底是詐尸還是另有隱情,我是刑警寧澤笆载,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布扑馁,位于F島的核電站,受9級特大地震影響宰译,放射性物質(zhì)發(fā)生泄漏檐蚜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一沿侈、第九天 我趴在偏房一處隱蔽的房頂上張望闯第。 院中可真熱鬧,春花似錦缀拭、人聲如沸咳短。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咙好。三九已至,卻和暖如春褐荷,著一層夾襖步出監(jiān)牢的瞬間勾效,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工叛甫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留层宫,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓其监,卻偏偏與公主長得像萌腿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抖苦,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容