物件導向程式設計思想 介面和抽象類

2021-10-23 05:55:40 字數 1739 閱讀 7075

介面抽象類

是否可以被例項化

是否可以寫抽象方法

是否可以寫普通方法

是否可以寫 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...