許多開發者誤以為介面是為了「替代多重繼承」。實則不然:介面的核心價值是「標識類別型別」,實現抽象;繼承的本質同樣是抽象,而非程式碼重用。本文以資料庫連線切換為例,層層推導工廠模式,揭示介面與繼承的設計哲學。
假設有 MySQL、SQLServer、Oracle 三個類,各自實現連線邏輯。為了讓上層業務不依賴具體類,定義介面:
public interface DB {
Connection openDB(String url, String user, String password);
void close();
}
各資料庫類實作 implements DB。但上層仍需 new MySQL() 等具體實例化,違反「開閉原則」。
public class DBFactory {
public static DB getConnection() {
// 可從配置檔讀取決定實例化哪個類
return new MySQL();
}
}
客戶端僅依賴 DB 介面:DB db = DBFactory.getConnection();。具體實例化邏輯封裝在工廠,後續擴充 PostgreSQL 只需修改工廠,業務碼零變動。
若類 B 想用類 A 的 run(),直接 extends A 是懶惰做法。正確做法是組合/委派:
class B {
private A a = new A();
void run() { a.run(); } // 委派給 A 實例
}
優點:B 不綁定 A 的實作細節,可輕易換成 A2、A3,符合「合成復用原則」。
Java 取締多重繼承、引入介面,迫使開發者區分「型別繼承」與「實作繼承」,本質是推動面向介面設計。濫用繼承是軟體腐化的萬惡之源;善用介面+組合+工廠,才能構建高內聚、低耦合、可演進的系統。