【设计模式之美】<Reading Notes>抽象类与接口
抽象類(lèi)特性
1、抽象類(lèi)不允許被實(shí)例化,只能被繼承。
2、抽象類(lèi)可以包含屬性和方法。方法既可以包含代碼實(shí)現(xiàn),也可以不包含代碼實(shí)現(xiàn)。不包含代碼實(shí)現(xiàn)的方法叫做抽象方法。
3、子類(lèi)繼承抽象類(lèi),必須實(shí)現(xiàn)抽象類(lèi)中的所有抽象方法。
接口特性
1、接口不能包含屬性(也就是成員變量)
2、接口職能聲明方法,方法不能包含代碼實(shí)現(xiàn)
3、類(lèi)實(shí)現(xiàn)接口的時(shí)候,必須實(shí)現(xiàn)接口中聲明的所有方法。
抽象類(lèi)的作用
1、代碼復(fù)用
2、多態(tài)的優(yōu)雅實(shí)現(xiàn)
關(guān)于第二點(diǎn)的具體解釋:
繼承不一定能夠?qū)崿F(xiàn)多態(tài),繼承+重寫(xiě)才能實(shí)現(xiàn)多態(tài)。
多態(tài)不一定需要抽象類(lèi),但是抽象類(lèi)能夠提升維護(hù)性和可讀性。
如果某個(gè)方法是空實(shí)現(xiàn)而不是抽象類(lèi),子類(lèi)可能忘記重寫(xiě)這個(gè)方法。
而且,一個(gè)空實(shí)現(xiàn)會(huì)讓維護(hù)者感到奇怪。
接口的作用
解耦。接口是對(duì)行為的一種抽象,相當(dāng)于一組協(xié)議。調(diào)用者只需要關(guān)注抽象的接口,而不需要了解具體的實(shí)現(xiàn),可以降低代碼間的耦合性。
C++通過(guò)抽象類(lèi)模仿接口
C++只有抽象類(lèi),沒(méi)有接口。
首先回顧之前的接口定義:
1、沒(méi)有成員變量
2、只有方法聲明,沒(méi)有方法實(shí)現(xiàn)
3、實(shí)現(xiàn)接口的類(lèi)必須實(shí)現(xiàn)接口中的所有方法
抽象類(lèi)Strategy沒(méi)有定義任何屬性,并且所有方法都聲明為virtual類(lèi)型(等同于java的abstract關(guān)鍵字).這樣所有的方法都不能有代碼實(shí)現(xiàn),并且每個(gè)繼承這個(gè)抽象類(lèi)的子類(lèi)都要實(shí)現(xiàn)這個(gè)方法。
從語(yǔ)法特性上來(lái)說(shuō),這個(gè)抽象類(lèi)就相當(dāng)于一個(gè)接口
使用普通類(lèi)實(shí)現(xiàn)接口
將構(gòu)造函數(shù)從public修改為protected,在方法實(shí)現(xiàn)中拋出異常,強(qiáng)制子類(lèi)必須實(shí)現(xiàn)父類(lèi)中的方法。
下面,使用java中的普通類(lèi)來(lái)模擬接口
MethodUnSupportedException異常,來(lái)模擬不包含實(shí)現(xiàn)的接口,并且能夠強(qiáng)迫子類(lèi)在繼承這個(gè)父類(lèi)的時(shí)候都主動(dòng)實(shí)現(xiàn)父類(lèi)的方法,否則就會(huì)在運(yùn)行的時(shí)候拋出異常。
兩者區(qū)別
接口與抽象的重要區(qū)別,出去語(yǔ)法特征,最重要的是概念上,抽象更像是一種類(lèi)的定義,而接口更像是協(xié)議。前者是屬于和繼承的關(guān)系,而接口是包含和具有的關(guān)系。
抽象:is-a
接口:has-a,表示具有某些功能。
從類(lèi)的繼承層次上來(lái)看,抽象類(lèi)是一種自下而上的設(shè)計(jì)思路,現(xiàn)有子類(lèi)的代碼重復(fù),再抽象成上層的父類(lèi)。接口相反,是一種自上而下的設(shè)計(jì)思路,一般是先設(shè)計(jì)接口,再去考慮具體實(shí)現(xiàn)。
總結(jié)
以上是生活随笔為你收集整理的【设计模式之美】<Reading Notes>抽象类与接口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 摩尔庄园洒水机怎么升级
- 下一篇: 检查男人不育到开封哪家医院好