is-a(繼承)表示「子類型擁有父類型的公開契約」,**不代表**擁有父類的實作細節。private 是實作細節,屬於類別內部封裝,子類別不應依賴。
| 需求 | 建議做法 |
|---|---|
| 子類需讀取父類資料 | 父類提供 protected 或 public getter |
| 子類需修改父類狀態 | 父類提供 protected setter 或受控方法 |
| 子類需擴充行為 | 父類定義 protected 模板方法 / 抽象方法 |
| 完全隱藏實作 | 保持 private,子類完全不知情 |
class Parent {
private String secret = "key"; // 子類不可見
protected String getSecret() { return secret; } // 受控存取
protected void setSecret(String s) { this.secret = s; }
}
class Child extends Parent {
void demo() {
// System.out.println(secret); // 編譯錯誤
System.out.println(getSecret()); // 正確
}
}
private 是封裝的基石,is-a 僅承諾公開/受保護介面的行為相容。**好的繼承設計:父類封裝細節,子類透過受保護介面互動。**