屬性繼承規則與方法高度一致,但有獨特的存取子(get/set)組合約束,掌握這些細節能避免編譯錯誤與執行期驚喜。
| 類型 | 關鍵字 | 核心規則 | 存取子約束 |
|---|---|---|---|
| 重載 | override | 名稱、型別、存取修飾詞一致 | 基類單 get → 衍生可單/雙;基類雙 → 衍生可單/雙 |
| 虛擬 | virtual | 可被 override | get/set 隱含 virtual |
| 抽象 | abstract | 無實現,衍生必須 override | 存取子隱含 virtual,不可有實現 |
| 密封 | sealed override | 終止繼承鏈 | 必須配合 override,存取子同樣 sealed |
static、virtual、override、abstract、sealed 任兩個不可共用(abstract override 除外,表示重寫基類虛屬性並保持抽象)
// 抽象基類
public abstract class People {
private string _name;
public virtual string Name { get => _name; } // 唯讀虛屬性
private Sex _sex;
public virtual Sex Sex { get => _sex; } // 唯讀虛屬性
protected string _idCard;
public abstract string IdCard { get; set; } // 抽象屬性:強制衍生類實現讀寫
}
// 具體衍生類
public class Customer : People {
public string RoomNo { get; set; }
public int StayDays { get; set; }
public override string Name { get => base.Name; } // 僅重載 get
public override Sex Sex { get => base.Sex; }
public override string IdCard { // 實現抽象屬性
get => _idCard;
set => _idCard = value;
}
}
get ≈ T Get()(同屬性修飾詞、無參、回傳屬性型別)set ≈ void Set(T value)(同屬性修飾詞、單 value 參數、void 回傳)virtual get,衍生 override get; set;virtual get; set;,衍生 override get;(set 可拋 NotSupportedException 或空實現)set 加驗證後呼叫 base.setoverride get => Compute(); 無 set善用屬性繼承規則,能建構語義清晰、封裝嚴密、可演進的領域模型。