共用方式為


遮蔽和覆寫的差異 (Visual Basic)

當您定義的類別繼承自基底類型時,您有時會想要重新定義衍生類別中的一或多個基底類型元素。 遮蔽和覆寫都可用於此用途。

比較

當衍生類別是繼承自基底類別時,遮蔽和覆寫兩者都可使用,且兩者都會以另一個宣告元素重新定義宣告元素。 不過,這兩者之間有顯著的差異。

下表會比較遮蔽與覆寫。

比較點 遮蔽 覆寫
目的 防止對基底類別進行後續修改,此修改會導入您已在衍生類別中定義的成員 對呼叫順序相同的程序或屬性定義不同實作,以達到多型1
已重新定義的元素 任何宣告的元素類型 僅限程序 (FunctionSubOperator) 或屬性
重新定義元素 任何宣告的元素類型 僅限呼叫順序相同的程序或屬性1
重新定義元素的存取層級 任何存取層級 無法變更被覆寫元素的存取層級
重新定義之元素的可讀性和可寫性 任何組合 無法變更被覆寫屬性的可讀性或可寫性
針對重新定義的控制 基底類型無法強制執行或禁制遮蔽 基底類型可指定 MustOverrideNotOverridableOverridable
關鍵字使用 在衍生類別中建議使用 Shadows;若未指定 Shadows,也未指定 Shadows,則會使用 Overrides2 基底類別需要使用 OverridableMustOverride;衍生類別則需要 Overrides
按衍生自衍生類別的類別重新定義元素繼承 遮蔽的元素會由進一步衍生的類別繼承;被遮蔽的元素仍會隱藏3 覆寫的元素會由進一步衍生的類別繼承;被覆寫的元素仍會受到覆寫

1「呼叫順序」由元素類型 (FunctionSubOperatorProperty)、名稱、參數清單及傳回型別組成。 您無法以屬性覆寫程序,反之亦然。 FunctionSubOperator 程序無法以其他類型的程序覆寫。

2若您未指定 ShadowsOverrides,則編譯器會發出警告訊息,協助您確定要使用的重新定義類型。 若您忽略警告,則會採用遮蔽機制。

3若在進一步衍生的類別中無法存取遮蔽元素,則不會繼承遮蔽。 例如,若您將遮蔽元素宣告為 Private,則衍生自衍生類別的類別即會繼承原始元素,而非繼承遮蔽元素。

指導方針

您通常會在下列情況中使用覆寫:

  • 您要定義多型衍生類別。

  • 您希望能安全地讓編譯器強制執行相同的元素類型和呼叫順序。

您通常會在下列情況中使用遮蔽:

  • 您預期基底類別可能會遭到修改,並使用與您元素相同的名稱定義某個元素。

  • 您希望自由變更元素類型或呼叫順序。

另請參閱