接口類與抽象函數類的區別

今天剛看到這,感覺有點糊塗,收集衆家所言彙總於此,以備忘


1.virtual:允許被重寫,但不強制要求。聲明時提供其自身實現;
2.abstract:強制要求其繼承者重寫。聲明時不提供其自身的實現,抽象類不能被實例化;
3.interface:接口就是協議,其聲明的成員(屬性,方法,事件和索引器)必須由其繼承的類實現。接口不能直接被實例化。

虛方法與抽象方法的區別在於,虛方法提供自身的實現,並且強制要求子類重寫;而抽象方法不提供自身的實現,並且強制子類重寫。

抽象類與接口很相似,但是思路不一樣。接口是公開類的成員,而抽象類則是抽象類成員以要求子類繼承並實現。


1. 抽象類和接口的比較

抽象類

接口

1

使用abstract關鍵字來定義抽象類。

使用interface關鍵字來定義接口。

2

在抽象類中可以定義抽象方法,也可以定義非抽象方法。

在接口中只能定義默認的抽象方法,不能定義非抽象的方法。接口實際上是一個純抽象類。

3

在抽象類中定義的抽象方法,沒有方法體。

在接口中定義的方法,沒有方法體。

4

在抽象類中能定義常量、變量、靜態方法和構造函數。

在接口中只能定義靜態常量和實例方法,不能定義實例常量、靜態變量、實例變量、靜態方法和構造函數。

5

抽象類本身不提供它所定義的抽象方法的實現。

抽象類能被繼承,由它的子類來實現在抽象類中定義的所有抽象方法。

接口本身不提供它所定義的方法的實現。

接口能被實現,由它的實現類來實現在接口中定義的所有方法。

6

在子類中必須覆蓋它的抽象類定義的所有抽象方法。

在實現類中必須實現它的接口定義的所有方法。

7

抽象類可以從另一個抽象類繼承。

接口可以從另一個接口繼承。

8

當一個抽象類繼承於另一個抽象類時,可以不用實現在基類(抽象類)中定義的抽象方法。

當一個接口繼承於另一個接口時,不用也不能實現它的父接口中定義的方法,因爲在接口中定義的方法是隱式的抽象方法,是沒有方法體的。

9

抽象類不能實例化。

接口不能實例化。

10

定義抽象類時不能使用final關鍵字。

定義接口時不能使用final關鍵字。

11

一個類只能繼承一個抽象類。

一個類可以實現多個接口。

 

 

(1) 抽象類主要用作基類,共享某些公共的成員和行爲。

(2) 接口主要用於類,在接口中定義這些類都具有的功能。

(3) 好的接口定義應該具有專一功能性的,而不是多功能的,否則造成接口污染。如果一個類只需要實現接口中的一個功能,而不得不去實現接口中的其它方法,這就叫接口污染。

(4) 抽象類主要用於一系列關係密切的對象;而接口適合爲不相關的類提供通用功能。

(5) 示例1

飛機會飛,鳥會飛,F22戰鬥機屬於飛機(抽象類),鴿子屬於(抽象類),但它們都實現了同一個接口“飛”。

(6) 示例2

就像鐵門和木門都是(抽象類),你想要門,我給不了(抽象類不能實例化),但我可以給你個具體的鐵門或木門(多態性);而且只能是門,你不能說它是窗(單繼承);一個門可以有(接口),也可以有門鈴(另一個接口,多實現)。門(抽象類)定義了是什麼,鎖(接口)規定了能做什麼,一個接口最好只能做一件事,你不能要求鎖也發出聲音(接口污染)

1. 抽象類和接口的比較

抽象類

接口

1

使用abstract關鍵字來定義抽象類。

使用interface關鍵字來定義接口。

2

在抽象類中可以定義抽象方法,也可以定義非抽象方法。

在接口中只能定義默認的抽象方法,不能定義非抽象的方法。接口實際上是一個純抽象類。

3

在抽象類中定義的抽象方法,沒有方法體。

在接口中定義的方法,沒有方法體。

4

在抽象類中能定義常量、變量、靜態方法和構造函數。

在接口中只能定義靜態常量和實例方法,不能定義實例常量、靜態變量、實例變量、靜態方法和構造函數。

5

抽象類本身不提供它所定義的抽象方法的實現。

抽象類能被繼承,由它的子類來實現在抽象類中定義的所有抽象方法。

接口本身不提供它所定義的方法的實現。

接口能被實現,由它的實現類來實現在接口中定義的所有方法。

6

在子類中必須覆蓋它的抽象類定義的所有抽象方法。

在實現類中必須實現它的接口定義的所有方法。

7

抽象類可以從另一個抽象類繼承。

接口可以從另一個接口繼承。

8

當一個抽象類繼承於另一個抽象類時,可以不用實現在基類(抽象類)中定義的抽象方法。

當一個接口繼承於另一個接口時,不用也不能實現它的父接口中定義的方法,因爲在接口中定義的方法是隱式的抽象方法,是沒有方法體的。

9

抽象類不能實例化。

接口不能實例化。

10

定義抽象類時不能使用final關鍵字。

定義接口時不能使用final關鍵字。

11

一個類只能繼承一個抽象類。

一個類可以實現多個接口。

 

 

(1) 抽象類主要用作基類,共享某些公共的成員和行爲。

(2) 接口主要用於類,在接口中定義這些類都具有的功能。

(3) 好的接口定義應該具有專一功能性的,而不是多功能的,否則造成接口污染。如果一個類只需要實現接口中的一個功能,而不得不去實現接口中的其它方法,這就叫接口污染。

(4) 抽象類主要用於一系列關係密切的對象;而接口適合爲不相關的類提供通用功能。

(5) 示例1

飛機會飛,鳥會飛,F22戰鬥機屬於飛機(抽象類),鴿子屬於(抽象類),但它們都實現了同一個接口“飛”。

(6) 示例2

就像鐵門和木門都是(抽象類),你想要門,我給不了(抽象類不能實例化),但我可以給你個具體的鐵門或木門(多態性);而且只能是門,你不能說它是窗(單繼承);一個門可以有(接口),也可以有門鈴(另一個接口,多實現)。門(抽象類)定義了是什麼,鎖(接口)規定了能做什麼,一個接口最好只能做一件事,你不能要求鎖也發出聲音(接口污染)

1. 抽象類和接口的比較

抽象類

接口

1

使用abstract關鍵字來定義抽象類。

使用interface關鍵字來定義接口。

2

在抽象類中可以定義抽象方法,也可以定義非抽象方法。

在接口中只能定義默認的抽象方法,不能定義非抽象的方法。接口實際上是一個純抽象類。

3

在抽象類中定義的抽象方法,沒有方法體。

在接口中定義的方法,沒有方法體。

4

在抽象類中能定義常量、變量、靜態方法和構造函數。

在接口中只能定義靜態常量和實例方法,不能定義實例常量、靜態變量、實例變量、靜態方法和構造函數。

5

抽象類本身不提供它所定義的抽象方法的實現。

抽象類能被繼承,由它的子類來實現在抽象類中定義的所有抽象方法。

接口本身不提供它所定義的方法的實現。

接口能被實現,由它的實現類來實現在接口中定義的所有方法。

6

在子類中必須覆蓋它的抽象類定義的所有抽象方法。

在實現類中必須實現它的接口定義的所有方法。

7

抽象類可以從另一個抽象類繼承。

接口可以從另一個接口繼承。

8

當一個抽象類繼承於另一個抽象類時,可以不用實現在基類(抽象類)中定義的抽象方法。

當一個接口繼承於另一個接口時,不用也不能實現它的父接口中定義的方法,因爲在接口中定義的方法是隱式的抽象方法,是沒有方法體的。

9

抽象類不能實例化。

接口不能實例化。

10

定義抽象類時不能使用final關鍵字。

定義接口時不能使用final關鍵字。

11

一個類只能繼承一個抽象類。

一個類可以實現多個接口。

 

 

(1) 抽象類主要用作基類,共享某些公共的成員和行爲。

(2) 接口主要用於類,在接口中定義這些類都具有的功能。

(3) 好的接口定義應該具有專一功能性的,而不是多功能的,否則造成接口污染。如果一個類只需要實現接口中的一個功能,而不得不去實現接口中的其它方法,這就叫接口污染。

(4) 抽象類主要用於一系列關係密切的對象;而接口適合爲不相關的類提供通用功能。

(5) 示例1

飛機會飛,鳥會飛,F22戰鬥機屬於飛機(抽象類),鴿子屬於(抽象類),但它們都實現了同一個接口“飛”。

(6) 示例2

就像鐵門和木門都是(抽象類),你想要門,我給不了(抽象類不能實例化),但我可以給你個具體的鐵門或木門(多態性);而且只能是門,你不能說它是窗(單繼承);一個門可以有(接口),也可以有門鈴(另一個接口,多實現)。門(抽象類)定義了是什麼,鎖(接口)規定了能做什麼,一個接口最好只能做一件事,你不能要求鎖也發出聲音(接口污染)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章