遮蔽和覆寫的差異 (Visual Basic)
當您定義的類別繼承自基底類型時,您有時會想要重新定義衍生類別中的一或多個基底類型元素。 遮蔽和覆寫都可用於此用途。
比較
當衍生類別是繼承自基底類別時,遮蔽和覆寫兩者都可使用,且兩者都會以另一個宣告元素重新定義宣告元素。 不過,這兩者之間有顯著的差異。
下表會比較遮蔽與覆寫。
比較點 | 遮蔽 | 覆寫 |
---|---|---|
目的 | 防止對基底類別進行後續修改,此修改會導入您已在衍生類別中定義的成員 | 對呼叫順序相同的程序或屬性定義不同實作,以達到多型1 |
已重新定義的元素 | 任何宣告的元素類型 | 僅限程序 (Function 、Sub 或 Operator ) 或屬性 |
重新定義元素 | 任何宣告的元素類型 | 僅限呼叫順序相同的程序或屬性1 |
重新定義元素的存取層級 | 任何存取層級 | 無法變更被覆寫元素的存取層級 |
重新定義之元素的可讀性和可寫性 | 任何組合 | 無法變更被覆寫屬性的可讀性或可寫性 |
針對重新定義的控制 | 基底類型無法強制執行或禁制遮蔽 | 基底類型可指定 MustOverride 、NotOverridable 或 Overridable |
關鍵字使用 | 在衍生類別中建議使用 Shadows ;若未指定 Shadows ,也未指定 Shadows ,則會使用 Overrides 2 |
基底類別需要使用 Overridable 或 MustOverride ;衍生類別則需要 Overrides |
按衍生自衍生類別的類別重新定義元素繼承 | 遮蔽的元素會由進一步衍生的類別繼承;被遮蔽的元素仍會隱藏3 | 覆寫的元素會由進一步衍生的類別繼承;被覆寫的元素仍會受到覆寫 |
1「呼叫順序」由元素類型 (Function
、Sub
、Operator
或 Property
)、名稱、參數清單及傳回型別組成。 您無法以屬性覆寫程序,反之亦然。 Function
、Sub
或 Operator
程序無法以其他類型的程序覆寫。
2若您未指定 Shadows
或 Overrides
,則編譯器會發出警告訊息,協助您確定要使用的重新定義類型。 若您忽略警告,則會採用遮蔽機制。
3若在進一步衍生的類別中無法存取遮蔽元素,則不會繼承遮蔽。 例如,若您將遮蔽元素宣告為 Private
,則衍生自衍生類別的類別即會繼承原始元素,而非繼承遮蔽元素。
指導方針
您通常會在下列情況中使用覆寫:
您要定義多型衍生類別。
您希望能安全地讓編譯器強制執行相同的元素類型和呼叫順序。
您通常會在下列情況中使用遮蔽:
您預期基底類別可能會遭到修改,並使用與您元素相同的名稱定義某個元素。
您希望自由變更元素類型或呼叫順序。