介面、虛擬函式、純虛擬函式、抽象類

我是胖球發表於2020-11-16

1. 介面

介面(硬體類介面)是指同一計算機不同功能層之間的通訊規則。

介面(軟體類介面)是指對協定進行定義的引用型別。其他型別實現介面,以保證他們支援某些操作,介面指定必須由類提供的成員或實現它的其他介面。與類相似,介面可以包含方法、屬性、索引器和事件作為成員。

Java中的介面

Java裡不允許多重繼承,所以如果要實現多個類的功能,則可以通過實現多個介面來實現。

Java介面和Java抽象類代表的就是抽象型別,就是我們需要提出的抽象層的具體表現。OOP物件導向的程式設計,如果要提高程式的複用率,增加程式的可維護性,可擴充套件性,就必須是面向介面的程式設計,面向抽象的程式設計,正確地使用介面、抽象類這些有用的抽象型別作為Java結構層次上的頂層。

Java介面和Java 抽象類的相似:

1. Java介面和Java抽象類的最大的一個區別,就在於Java抽象類可以提供某些方法的部分實現,而Java介面不可以。如果向一個抽象類里加入一個新的具體方法時,那麼它的所有子類都一下子得到了這個新方法,而Java介面做不到這一點。如果向Java介面裡加入一個新方法,所有實現這個介面的類就無法成功通過編譯了,必須讓每一個類都再實現這個方法才行,這是Java介面的缺點。

2. 一個抽象類的實現只能由這個抽象類的子類給出,這個實現處在抽象類所定義出的繼承的等級結構中,而由於Java語言的單繼承性,所以抽象類作為型別定義工具的效能大打折扣。Java介面在這一點上具有優勢,任何一個實現了一個Java介面所規定的方法的類都可以具有這個介面的型別,而一個類可以實現任意多個Java介面,從而這個類就有了多種型別。

3. Java介面是定義混合型別的理想工具,混合類表明一個類不僅具有某個主型別的行為,而且具有其他的次要行為。

物件導向的介面

在C++中,一個類被允許繼承多個類,但是在Java以後的語言不允許。

這樣,如果想繼承多個類時便非常困難,所以開發方想出了新辦法:介面

一個介面內,允許包含變數、常量等一個類所包含的基本內容。但是介面中的函式不允許設定程式碼,也就意味著不能把程式放到介面裡。介面是專門被繼承的,介面存在的意義也是被繼承。和C++裡的抽象類裡的純虛擬函式是相同的。不能被例項化。

定義介面的關鍵字是interface,繼承介面的關鍵字是implements,相當於繼承類的extend。需要注意的是,當繼承一個介面時,介面裡的所有函式必須被覆蓋。

當想繼承多個類時,開發程式不允許,報錯。這樣就要用到介面,因為介面允許多重繼承,而類不允許。所以就要用到介面。

 

虛擬函式

在某基類中宣告為virtual並在一個或多個派生類中被重新定義的成員函式,用法格式為:virtual函式返回型別 函式名(引數列表){函式實體};實現多型性,通過指向派生類的基類指標或引用,訪問派生類中同名覆蓋成員函式。

簡單的說,被virtual關鍵字修飾的成員函式就是虛擬函式。虛擬函式的作用用專業術語來說就是實現多型性。多型性是將介面與實現分離,用形象的語言來解釋就是實現以共同的方法,但因個體差異,而採用不同的策略。

 

相關文章