在物件導向程式設計中,abstract class(抽象類別)和 interface(介面)都是用來定義類別應該具備的行為而不實現它們的方式。儘管它們的目標相似,但它們在使用和設計上有一些重要的區別:
抽象類別 (Abstract Class):
- 狀態和實現:抽象類別可以擁有實例變量(或稱為狀態),並且可以包含已實現的方法。
- 繼承:一個類別只能繼承一個抽象類別,這限制了抽象類別的多重繼承。
- 構造函數:抽象類別可以擁有構造函數。
- 存取修飾符:抽象類別中的方法和變量可以是任何存取級別(private、protected、public)。
- 擴展性:當一個類別繼承自抽象類別時,它可以使用抽象類別提供的方法和變量,這有助於避免代碼重複。
- 版本控制:當需要修改基類的行為時,可以在抽象類別中增加新的方法實現。
介面 (Interface):
- 純行為:介面只能定義行為,不能擁有狀態(不可以有實例變量),且定義的方法不能有實現(在 Java 8 之前)。Java 8 後,介面可以有默認方法(default methods)和靜態方法(static methods)的實現。
- 多重實現:一個類別可以實現多個介面,這允許多重繼承的行為。
- 構造函數:介面不能有構造函數。
- 存取修飾符:介面中定義的所有方法預設為 public,且不允許指定任何其他存取級別。
- 多形性:介面是實現多形性的理想選擇,它可以用來定義可以由多個無關類別實現的通用協議。
- 版本控制:一旦一個介面被釋出,如果需要增加新方法,通常需要創建新的介面或使用默認方法,因為對原有介面的修改會破壞實現該介面的所有類別。
總結來說,抽象類別適合於類別間有較大的相關性且希望共享代碼的情況;而介面更適合於定義非相關類別之間的協議,或者當你希望指定一個可以被多個互不相關的類別實現的通用行為合約時使用。這兩種類型在現代程式設計中都非常有用,它們可以互相補充,也可以根據具體需求單獨使用。