第 26 課系統講解訪問修飾符在 C++、Java、C# 中的異同,確立「盡可能使用限制性更強的修飾符」原則,深入剖析域成員與方法成員的訪問選擇策略,並昇華至「客戶意識」與「接口責任感」的工程師素質層面。
| 訪問範圍 | C++ | Java | C# |
|---|---|---|---|
| 無限制 | public | public | public |
| 子類或同一包/程序集 | — | protected | protected internal |
| 同一類或子類 | protected | private protected (已棄用) | protected |
| 同一包/程序集 | — | package (默認) | internal |
| 同一類 | private (默認) | private | private (默認) |
關鍵差異:Java protected = 子類 + 同包,等同 C# protected internal;C++/C# protected 僅子類可見,等同 Java 已棄用的 private protected。
public:對所有類提供核心服務(抽象接口)protected 服務子類package/internal:僅模塊內部協作(較少見)private:實現細節,非服務,改動不影響客戶修改影響半徑與訪問層級正相關:
private:僅本類,重構成本最低package/internal:包內可控protected:涉及子類,若類為 public 則跨包,難以掌控public:任意類可調用,修改代價最高,責任最大成熟工程師對 public/protected 接口設計「慎之又慎」,投入精力遠超具體實現代碼。
接口必須變更時,標記棄用並保留舊版本一段時間,給客戶遷移緩衝期——這是設計者對使用者的致歉。
客戶定義:調用你代碼的代碼或編寫者(中間消費者),非終端用戶。
缺乏原因:
培養途徑:
「訪問控制不僅是語法限制,也是語義規范——標有 public 的接口對閱讀者比文檔更正式直觀。」「合法指合乎語法,合理指合乎語義。法律是社會秩序的最低限度,一個只守法律不守規范的人必與社會格格不入。」