一個類繼承一個接口的實(shí)現(xiàn)類、兩個類實(shí)現(xiàn)同一個接口、兩個類同時繼承一個實(shí)現(xiàn)了某一接口的抽象類。三者的區(qū)別是什么呢
-
架構(gòu)對比圖
類繼承接口的實(shí)現(xiàn)類
[接口] ↑ [實(shí)現(xiàn)類] ↑ [子類]子類通過繼承獲得接口的實(shí)現(xiàn),可以選擇性重寫方法。
兩個類實(shí)現(xiàn)同一個接口
[接口] ↑ ↑ [類A] [類B]每個類獨(dú)立實(shí)現(xiàn)接口,提供自己的行為實(shí)現(xiàn)。
繼承實(shí)現(xiàn)接口的抽象類
[接口] ↑ [抽象類] ↑ ↑ [類A] [類B]抽象類提供部分實(shí)現(xiàn),子類完成特定功能的實(shí)現(xiàn)。
1. 兩個類實(shí)現(xiàn)同一個接口
2. 一個類繼承接口的實(shí)現(xiàn)類
3. 兩個類繼承實(shí)現(xiàn)了接口的抽象類
2. 代碼復(fù)用與繼承層次
模式 代碼復(fù)用機(jī)制 繼承層次特點(diǎn) 風(fēng)險與限制 繼承接口的實(shí)現(xiàn)類 通過繼承父類B復(fù)用其邏輯(包括接口I的實(shí)現(xiàn)) 形成“接口→父類→子類”的縱向繼承鏈 父類B的修改可能影響子類A;若子類重寫方法可能導(dǎo)致“行為不一致” 兩個類實(shí)現(xiàn)同一接口 無直接代碼復(fù)用,各實(shí)現(xiàn)類獨(dú)立實(shí)現(xiàn)接口方法 平行結(jié)構(gòu),無繼承關(guān)聯(lián) 重復(fù)代碼風(fēng)險高,但靈活性更強(qiáng) 繼承實(shí)現(xiàn)接口的抽象類 通過抽象類復(fù)用公共邏輯(如模板方法),子類專注差異化實(shí)現(xiàn) 抽象類作為基類,子類繼承其實(shí)現(xiàn) 抽象類的修改會影響所有子類;若抽象類未完全實(shí)現(xiàn)接口,子類需補(bǔ)全 3. 多態(tài)性與類型系統(tǒng)
模式 多態(tài)性表現(xiàn) 類型關(guān)系 接口契約履行 繼承接口的實(shí)現(xiàn)類 子類A的實(shí)例可向上轉(zhuǎn)型為接口I,同時保留父類B的特性 類A是類B的子類,類B是接口I的實(shí)現(xiàn)類 通過父類B履行接口契約 兩個類實(shí)現(xiàn)同一接口 類C和類D的實(shí)例均可視為接口I的類型,具體行為由各自實(shí)現(xiàn)決定 接口I是抽象契約,類C和類D是獨(dú)立實(shí)現(xiàn) 直接履行接口契約,無中間層 繼承實(shí)現(xiàn)接口的抽象類 子類E和F的實(shí)例可視為接口I的類型,同時共享抽象類的公共方法 抽象類是接口I的實(shí)現(xiàn)類,子類繼承抽象類 通過抽象類履行接口契約,子類可擴(kuò)展或覆蓋 4. 設(shè)計原則與擴(kuò)展性
模式 開閉原則 單一職責(zé)原則 里氏替換原則 擴(kuò)展性 繼承接口的實(shí)現(xiàn)類 修改父類B可能違反開閉原則(影響子類A) 父類B可能承擔(dān)過多職責(zé)(如同時實(shí)現(xiàn)接口和業(yè)務(wù)邏輯) 子類A需能替換父類B而不破壞程序邏輯 新增子類需繼承現(xiàn)有父類,擴(kuò)展受限 兩個類實(shí)現(xiàn)同一接口 符合開閉原則(新增實(shí)現(xiàn)類無需修改現(xiàn)有代碼) 各實(shí)現(xiàn)類職責(zé)單一,僅關(guān)注接口方法實(shí)現(xiàn) 無繼承關(guān)系,自然滿足 新增實(shí)現(xiàn)類自由,擴(kuò)展性強(qiáng) 繼承實(shí)現(xiàn)接口的抽象類 抽象類提供公共邏輯,符合開閉原則(新增子類繼承抽象類) 抽象類可分離接口實(shí)現(xiàn)與業(yè)務(wù)邏輯,子類專注差異化 子類需能替換抽象類而不破壞程序邏輯 通過抽象類統(tǒng)一擴(kuò)展點(diǎn),擴(kuò)展便捷 三種方式的對比總結(jié)
適用場景與區(qū)別
- 類繼承接口的實(shí)現(xiàn)類:適用于需要重用現(xiàn)有實(shí)現(xiàn)的情況,子類可以擴(kuò)展或修改父類的實(shí)現(xiàn)
- 兩個類實(shí)現(xiàn)同一個接口:適用于不同類有完全不同實(shí)現(xiàn)的情況,強(qiáng)調(diào)多態(tài)性
- 繼承實(shí)現(xiàn)接口的抽象類:適用于有部分共同實(shí)現(xiàn)但又有差異的情況,平衡代碼復(fù)用和靈活性
設(shè)計考慮
- 如果需要最大程度的代碼復(fù)用,選擇第一種或第三種方式
- 如果需要最大程度的靈活性,選擇第二種方式
- 如果需要在多個類間共享一些公共代碼,但同時允許不同實(shí)現(xiàn),選擇第三種方式

浙公網(wǎng)安備 33010602011771號