繼承基類雖獲得豐富功能,但並非所有都適合你的控件。本文介紹兩大「減法」技巧:禁用 Controls 集合容器行為、隱藏不需要的繼承屬性。
所有繼承 Control 的類別預設擁有 Controls 集合,可當容器使用。若控件純輸出內容 (如 Literal),不應允許加入子控件。
protected override ControlCollection CreateControlCollection()
{
return new EmptyControlCollection(this);
}
EmptyControlCollection 任何 Add/Remove 操作皆拋出 HttpException,明確禁止容器行為。Literal、Image、Label (若不需當容器) 等葉子控件。繼承 WebControl 會帶入 BorderColor、BackColor、Font 等 20+ 樣式屬性。若控件不需要 (如資料源控件),可隱藏:
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[Bindable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public override Color BorderColor
{
get { return Color.Empty; }
set { /* 忽略 */ }
}
new 關鍵字隱藏基類實作 (非覆寫),避免多態調用基類邏輯。Browsable(false))EditorBrowsable(Never))DesignerSerializationVisibility.Hidden)Bindable(false))EnableTheming、SkinID、ToolTip、TabIndex 等。「介面隔離原則 (ISP) 在控件開發同樣適用:控件只暴露其真正需要的契約。主動關閉不必要功能,能減少使用者認知負擔、防止誤用、降低序列化/ViewState 開銷。」
下一篇將介紹「HtmlTextWriter 規範輸出」、「分段渲染重構」、「ID 命名策略」與「動態屬性條件輸出」四大渲染最佳實踐。