介面抽象類
是否可以被例項化否
否是否可以寫抽象方法是
是是否可以寫普通方法否
是是否可以寫 static 方法是
是是否可以寫 default 方法是
否是否可以寫屬性是
是訪問修飾符都為 public
可以自定義
抽象類描述了 is-a 的關係,表示乙個類是什麼,可以解決**復用的問題。
典型的場景,通過 「模版方法」 模式,來提高**復用性。很明顯,要想使用 「模版方法」 模式,肯定需要抽象類。
這裡舉個例子:
/**
* 抽象的查詢執行器類
*/public
abstract
class
abstractfindexecutor
private string buildselectfields()
private string buildcriteria()
protected
abstract string dofind()
;}/** * 分頁查詢的執行類
*/public
class
findpageexecutor
extends
abstractfindexecutor
private string buildpageable()
private string buildresult()
private string findpagedb()
}
這個例子中,abstractfindexecutor
類中的 find 方法描述了乙個查詢過程。
其中分為三步:
拼接查詢字段
拼接查詢條件
查詢 db
其中第三步不同的查詢方法執行的邏輯是不一樣的,比如 「分頁查詢」 需要構造分頁條件和需要組裝分頁返回資料。
這樣子做的目的將查詢中公用的方法提取到抽象類的 find 方法中。針對每種查詢特有的方法,重寫抽象方法實現自身子類特有的方法邏輯。
如果這裡沒有使用抽象類,那麼原本抽象類中的 dofind() 這個方法不能宣告為抽象方法,只能宣告乙個空方法,且空方法中還需要throw new unsupportedoperationexception()
,這樣的實現不優雅。
為什麼不優雅,因為子類沒有實現這個空方法,也不會編譯報錯,不容易在編碼的過程中發現問題,其實這又提公升了 bug 的出現率。
介面描述了 has-a 的關係,表示乙個類有某些能力。
使用介面也體現了 「面向介面程式設計而非實現」。這裡體現的思想也就是之前提到的 「抽象」。因為面向介面程式設計後,就實現了約定和實現相分離,只要約定不變,實現無論怎麼改變對呼叫方不感知,這樣也和呼叫方解耦了,沒有強關聯。
其實也比較好區別的,因為抽象類描述 is-a 的關係,介面是描述 has-a 的關係
這裡再解釋一下,is-a 表示 a 類是 b 類的意思。has-a 表示 a 類具有 b 類(可能是個介面)的能力抽象類是解決**復用問題
介面是解決拓展問題的
設計原則與思想 介面和抽象類
08 理論五 介面vs抽象類的區別?如何用普通的類模擬抽象類和介面?抽象類和介面能解決什麼程式設計問題?抽象類不允許被例項化,只能被繼承,抽象類 復用,多型性的優雅實現 為什麼需要介面?它能夠解決什麼程式設計問題?介面 不允許例項化,只能被實現 不包含屬性和普通方法,包含抽象方法 靜態方法 defa...
物件導向程式設計 抽象類與介面
1 抽象類 宣告抽象類使用關鍵字abstract。抽象類,不能直接被例項化,只能被繼承。必須先繼承該抽象類,然後再例項化子類。抽象方法,不能包括具體的功能實現。繼承抽象類的子類必須實現抽象類中的所有抽象方法,具體實現根據業務需求有所不同。抽象類中至少要包含乙個抽象方法。如果抽象類中某個抽象方法被宣告...
物件導向 介面類 抽象類
python 沒有介面這個概念 介面類,抽象類 制定乙個規範.介面類,抽象類 python中就是一樣的 1,歸一化設計.2,制定乙個規範,凡是繼承我類的類,必須有我規定的方法.第一版class alipay def init self,money self.money money defpay se...