- 設(shè)計(jì)模式之禪
- 秦小波
- 853字
- 2019-01-02 03:55:45
2.1 愛(ài)恨糾葛的父子關(guān)系
在面向?qū)ο蟮恼Z(yǔ)言中,繼承是必不可少的、非常優(yōu)秀的語(yǔ)言機(jī)制,它有如下優(yōu)點(diǎn):
?代碼共享,減少創(chuàng)建類(lèi)的工作量,每個(gè)子類(lèi)都擁有父類(lèi)的方法和屬性;
?提高代碼的重用性;
?子類(lèi)可以形似父類(lèi),但又異于父類(lèi),“龍生龍,鳳生鳳,老鼠生來(lái)會(huì)打洞”是說(shuō)子擁有父的“種”,“世界上沒(méi)有兩片完全相同的葉子”是指明子與父的不同;
?提高代碼的可擴(kuò)展性,實(shí)現(xiàn)父類(lèi)的方法就可以“為所欲為”了,君不見(jiàn)很多開(kāi)源框架的擴(kuò)展接口都是通過(guò)繼承父類(lèi)來(lái)完成的;
?提高產(chǎn)品或項(xiàng)目的開(kāi)放性。
自然界的所有事物都是優(yōu)點(diǎn)和缺點(diǎn)并存的,即使是雞蛋,有時(shí)候也能挑出骨頭來(lái),繼承的缺點(diǎn)如下:
?繼承是侵入性的。只要繼承,就必須擁有父類(lèi)的所有屬性和方法;
?降低代碼的靈活性。子類(lèi)必須擁有父類(lèi)的屬性和方法,讓子類(lèi)自由的世界中多了些約束;
?增強(qiáng)了耦合性。當(dāng)父類(lèi)的常量、變量和方法被修改時(shí),必需要考慮子類(lèi)的修改,而且在缺乏規(guī)范的環(huán)境下,這種修改可能帶來(lái)非常糟糕的結(jié)果—大片的代碼需要重構(gòu)。
Java使用extends關(guān)鍵字來(lái)實(shí)現(xiàn)繼承,它采用了單一繼承的規(guī)則,C++則采用了多重繼承的規(guī)則,一個(gè)子類(lèi)可以繼承多個(gè)父類(lèi)。從整體上來(lái)看,利大于弊,怎么才能讓“利”的因素發(fā)揮最大的作用,同時(shí)減少“弊”帶來(lái)的麻煩呢?解決方案是引入里氏替換原則(Liskov Substitution Principle,LSP),什么是里氏替換原則呢?它有兩種定義:
?第一種定義,也是最正宗的定義:If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.(如果對(duì)每一個(gè)類(lèi)型為S的對(duì)象o1,都有類(lèi)型為T(mén)的對(duì)象o2,使得以T定義的所有程序P在所有的對(duì)象o1都代換成o2時(shí),程序P的行為沒(méi)有發(fā)生變化,那么類(lèi)型S是類(lèi)型T的子類(lèi)型。)
?第二種定義:Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.(所有引用基類(lèi)的地方必須能透明地使用其子類(lèi)的對(duì)象。)
第二個(gè)定義是最清晰明確的,通俗點(diǎn)講,只要父類(lèi)能出現(xiàn)的地方子類(lèi)就可以出現(xiàn),而且替換為子類(lèi)也不會(huì)產(chǎn)生任何錯(cuò)誤或異常,使用者可能根本就不需要知道是父類(lèi)還是子類(lèi)。但是,反過(guò)來(lái)就不行了,有子類(lèi)出現(xiàn)的地方,父類(lèi)未必就能適應(yīng)。
- 演進(jìn)式架構(gòu)(原書(shū)第2版)
- Modular Programming with Python
- ASP.NET Core 5.0開(kāi)發(fā)入門(mén)與實(shí)戰(zhàn)
- Photoshop智能手機(jī)APP UI設(shè)計(jì)之道
- HTML5游戲開(kāi)發(fā)案例教程
- 老“碼”識(shí)途
- HTML5+CSS3網(wǎng)站設(shè)計(jì)教程
- Mastering Unity Shaders and Effects
- 概率成形編碼調(diào)制技術(shù)理論及應(yīng)用
- Windows Server 2016 Automation with PowerShell Cookbook(Second Edition)
- Android驅(qū)動(dòng)開(kāi)發(fā)權(quán)威指南
- Java程序設(shè)計(jì)教程
- Elasticsearch搜索引擎構(gòu)建入門(mén)與實(shí)戰(zhàn)
- React.js實(shí)戰(zhàn)
- Laravel 5.x Cookbook