功能 P1 由類 A 實現。擴展為 P = P1 + P2,由子類 B 實現。若 B 覆寫 A 的方法導致 P1 行為改變,即違反 LSP。
// 違反 LSP
class Rectangle {
protected int w, h;
public Rectangle(int w, int h) { this.w = w; this.h = h; }
public int area() { return w * h; }
}
class Square extends Rectangle {
public Square(int w, int h) { super(w, h); }
public int area() { return w * w; } // 覆寫破壞契約
}
class Test {
public static void main(String[] args) {
Rectangle r = new Rectangle(10, 20);
// Rectangle r = new Square(10, 20); // 替換後 area() 錯誤
System.out.println("面積:" + r.area());
}
}
| 原則 | 核心要求 | 違反後果 |
|---|---|---|
| LSP | 子類可替換父類 | 多態失效、運行時錯誤 |
| OCP | 對擴展開放、修改關閉 | 頻繁修改基類、測試成本高 |
| ISP | 介面最小化、高內聚 | 實現不需要的方法、臃腫介面 |