抽象类,接口
抽象類(lèi)
1.抽象類(lèi)不允許被實(shí)例化,只能被繼承。
2.抽象類(lèi)可以包含屬性和方法。
3.子類(lèi)繼承抽象類(lèi),必須實(shí)現(xiàn)抽象類(lèi)中的所有抽象方法。
?
接口
ps: jdk1.8中, 接口可以包含屬性,也能夠定義方法實(shí)現(xiàn)。
?
? ? 繼承關(guān)系是一種 is-a 的關(guān)系,那抽象類(lèi)既然屬于類(lèi),也表示一種 is-a 的關(guān)系。相對(duì)于抽象類(lèi)的 is-a 關(guān)系來(lái)說(shuō),接口表示一種 has-a 關(guān)系,表示具有某些功能。對(duì)于接口,有一個(gè)更加形象的叫法,那就是協(xié)議(contract)。
? ?抽象類(lèi)更多的是為了代碼復(fù)用,而接口就更側(cè)重于解耦。
?
基于接口編程
實(shí)際上,“基于接口而非實(shí)現(xiàn)編程”這條原則的另一個(gè)表述方式,是“基于抽象而非實(shí)現(xiàn)編程”。
? ? ?越抽象、越頂層、越脫離具體某一實(shí)現(xiàn)的設(shè)計(jì),越能提高代碼的靈活性,越能應(yīng)對(duì)未來(lái)的需求變化。好的代碼設(shè)計(jì),不僅能應(yīng)對(duì)當(dāng)下的需求,而且在將來(lái)需求發(fā)生變化的時(shí)候,仍然能夠在不破壞原有代碼設(shè)計(jì)的情況下靈活應(yīng)對(duì)。而抽象就是提高代碼擴(kuò)展性、靈活性、可維護(hù)性最有效的手段之一。
?
? 軟件開(kāi)發(fā)中唯一不變的就是變化。
? 這條原則的設(shè)計(jì)初衷是,將接口和實(shí)現(xiàn)相分離,封裝不穩(wěn)定的實(shí)現(xiàn),暴露穩(wěn)定的接口。上游系統(tǒng)面向接口而非實(shí)現(xiàn)編程,不依賴(lài)不穩(wěn)定的實(shí)現(xiàn)細(xì)節(jié),這樣當(dāng)實(shí)現(xiàn)發(fā)生變化的時(shí)候,上游系統(tǒng)的代碼基本上不需要做改動(dòng),以此來(lái)降低代碼間的耦合性,提高代碼的擴(kuò)展性。
??在面向?qū)ο缶幊讨?#xff0c;有一條非常經(jīng)典的設(shè)計(jì)原則,那就是:組合優(yōu)于繼承,多用組合少用繼承。
? 繼承主要有三個(gè)作用:表示 is-a 關(guān)系,支持多態(tài)特性,代碼復(fù)用。而這三個(gè)作用都可以通過(guò)組合、接口、委托三個(gè)技術(shù)手段來(lái)達(dá)成。
?
?
?
?
?
??
總結(jié)
- 上一篇: 面向对象,面向过程编程
- 下一篇: 贫血模型,充血模型(领域驱动设计)