PHP抽象類與介面的異同

2021-06-22 02:22:33 字數 2182 閱讀 2633

抽象類與介面的異同

一、相同點:

1. 兩者都是抽象類,都不能例項化

2.inte***ce實現類及abstract class的子類都必須要實現已經宣告的抽象方法

二、 不同點:

1.inte***ce需要實現,要用implements,而abstract class需要繼承,要用extends

2.乙個類可以實現多個inte***ce,但乙個類只能繼承乙個abstract class

3.inte***ce強調特定功能的實現,而abstract class強調所屬關係

4.儘管inte***ce實現類及abstract class的子類都必須要實現相應的抽象方法,但實現的形式不同。inte***ce中的每乙個方法都是抽象方法,都只是宣告的 (declaration, 沒有方法體 ) ,實現類必須要實現。而abstract class的子類可以有選擇地實現。

這個選擇有兩點含義: 

a:

abstract class中並非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子類必須實現。那些沒有abstract的方法,在abstract class中必須定義方法體; 

b:

abstract class的子類在繼承它時,對非抽象方法既可以直接繼承,也可以覆蓋;而對抽象方法,可以選擇實現,也可以留給其子類來實現,但此類必須也宣告為抽象類。

5.abstract classinte***ceclass的中介。abstract classinte***ceclass中起到了承上啟下的作用。一方面,abstract class是抽象的,可以宣告抽象方法,以規範子類必須實現的功能;另一方面,它又可以定義預設的方法體,供子類直接使用或覆蓋。另外,它還可以定義自己的例項變數,以供子類通過繼承來使用

6.介面中的抽象方法前不用也不能加abstract關鍵字,預設隱式就是抽象方法,也不能加 final 關鍵字來防止抽象方法的繼承。而抽象類中抽象方法前則必須加上abstract表示顯示宣告為抽象方法

7.介面中的抽象方法預設是 public 的,也只能是 public 的,不能用 private , protected 修飾符修飾。而抽象類中的抽象方法則可以用 public ,protected 來修飾,但不能用 private 

三. inte***ce的應用場合

1.類與類之間需要特定的介面進行協調,而不在乎其如何實現

2.作為能夠實現特定功能的標識存在,也可以是什麼介面方法都沒有的純粹標識

3.需要將一組類視為單一的類,而呼叫者只通過介面來與這組類發生聯絡

4.需要實現特定的多項功能,而這些功能之間可能完全沒有任何聯絡

四. abstract class的應用場合

一句話,在既需要統一的介面,又需要例項變數或缺省的方法的情況下,就可以使用它。最常見的有:

1.定義了一組介面,但又不想強迫每個實現類都必須實現所有的介面。可以用 abstract class 定義一組方法體,甚至可以是空方法體,然後由子類選擇自己所感興趣的方法來覆蓋

2.某些場合下,只靠純粹的介面不能滿足類與類之間的協調,還必需類中表示狀態的變數來區別不同的關係。 abstract 的中介作用可以很好地滿足這一點

3.規範了一組相互協調的方法,其中一些方法是共同的,與狀態無關的,可以共享的,無需子類分別實現;而另一些方法卻需要各個子類根據自己特定的狀態來實現特 定的功能 

抽象類和介面的異同

抽象類 有抽象方法的類必須定義成抽象類,抽象類可以沒有抽象方法 抽象類和介面的相同點 1.代表系統的抽象層,都不能例項化,都能包含抽象方法 用於描述系統提供的服務,不必提供具體實現 2.都可以指向子類 實現類 物件 不同點 1.構造方法 抽象類可以有構造方法,介面中不能有構造方法 2.變數 1 普通...

抽象類和介面的異同

抽象類 使用abstract關鍵字宣告 抽象方法不能是private 抽象類不能直接例項化,其實例可以使用子類向上轉型的方式獲得 子類如果沒有重寫全部抽象方法則仍是抽象類 子類只能extends乙個類 介面 抽象方法的集合,以inte ce關鍵字宣告,子類可以使用implements繼承多個介面 子...

抽象類和介面的異同

1 不能例項化 2 如果繼承某個抽象類或者實現某個介面,需要實現所有的抽象方法,否則該類仍是抽象來。抽象類 1 成員變數 變數和常量都可以 2 成員方法 抽象方法和非抽象方法都可以 3 構造方法 可以有 接 口 1 成員變數 只可以是常量 2 成員方法 只可以是抽象方法 3 構造方法 不允許有,禁止...