如何在Java中選擇介面和抽象類
什麼是抽象類?
摘要意味著某些東西不是完全具體的 - 它只是一個想法或某事的要點。因此,當我們討論抽象類時,它意味著一個本身沒有具體實現的類。這只是為其他具體類建立的結構或指南。我們可以說抽象類是具體類的靈魂。這就是我們“擴充套件”抽象類的原因。抽象類應該只有那些屬性和方法,沒有它們就不能存在具體的類。
這就是Java不支援抽象類的多重繼承的原因。因為一個具體的類只能表現(或佔用所有屬性)只有一個抽象類(顯然,一個體不能有兩個靈魂)。
例如, Man
並且 Car
有許多常見的行為,例如運動,創造聲音等,但是一個
Car
類只能表現得像 Vehicle
一個人,而不是一個人,而且這個 Man
類只能表現得像人,而不是車輛。
我同意上面的例子是蹩腳的,但即使在現實生活場景中,如果你不確定你應該繼承哪個抽象類,或者你認為需要繼承多個抽象類,那麼這是一種設計氣味,並且你應該重新審視你的專案設計。
基於我們上面討論的內容,我們需要建立一個 Vehicle
抽象類。這個抽象類將具有Engine,Shape等屬性 Car
和相關方法。我們增加 Engine
Shape
在抽象類,因為可以在沒有這兩個不存在車輛。
抽象 類 車輛 {
私有 String 引擎 ;
abstract void startEngine();
abstract void stopEngine();
}
什麼是介面?
介面是不同系統之間的行為契約。在Java介面中,我們定義了一個類的行為,它將實現這個介面。
例如,汽車可以移動,因此我們可以建立一個可移動的介面並在我們的Car
班級中實現它 。漂移和喇叭行為也是如此。這些是Car
方法的行為 ,而不是內建屬性。一 Car
會車,即使它不能移動。
interface Movable {
void move();
}
令人遺憾的是,我們習慣於在幾乎忘記抽象類的功能,它們的使用以及建立它們的意圖的層面上使用介面。
與汽車類建立相關的虛擬Java程式碼
class Car extends 車輛 工具 Movable {
@覆蓋
void startEngine(){
系統。出。println(“啟動汽車引擎”);
}
@覆蓋
void stopEngine(){
系統。出。println(“停止汽車引擎”);
}
@覆蓋
public void move(){
系統。出。println(“動車”);
}
}
摘要
與抽象類建立相關的關鍵要點:
在為具體類提供準則時建立抽象類。
抽象類建立與您是否要提供任何方法的實現完全無關。
僅將這些屬性和行為新增到抽象類中,否則您的具體類將失去其存在。例如,
Vehicle
沒有引擎就不能存在。
與介面建立相關的關鍵要點:
建立為您的具體類提供附加行為的介面。當我們將這些介面共享到外部系統時,它就變成了契約,這就是為什麼我們說介面是具體類的行為契約。
這些行為不應該是您的課程必需的。這些行為應該為您的類新增更多功能。例如, 即使它不能移動,也
Car
將是aCar
。問一個問題,每當具體類實現你的介面時,它是否需要你的介面中提到的所有行為,或者只需要幾個?在多個介面中重構您的介面,直到上述問題的答案為是。
謝謝閱讀!