當您定義一個類別以繼承自基類時,有時您可能希望在衍生類別中重新定義基類中的一個或多個成員。 陰影和覆寫都可用於此目的。
比較
當衍生類別繼承自基類時,會使用遮蔽和覆寫,並用另一個元素重新定義一個已宣告的元素。 但兩者之間有顯著差異。
下表比較陰影與覆寫。
| 比較點 | 陰影 | 覆寫 |
|---|---|---|
| 目標 | 防止後續的基類修改,引進您已在衍生類別中定義的成員 | 使用相同呼叫序列1定義程式或屬性的不同實作,以達到多型 |
| 重新定義的元素 | 任何宣告的項目類型 | 只有程序 (Function、Sub或Operator)或屬性 |
| 重新定義元素 | 任何宣告的項目類型 | 只有具有相同呼叫序列1 的程序或屬性 |
| 重新定義元素的存取層級 | 任何存取層級 | 無法變更被覆寫元素的存取層級 |
| 重新定義元素的可讀性和可寫入性 | 任何組合 | 無法變更覆寫屬性的可讀性或可寫入性 |
| 對重新定義的掌控 | 基類元素無法強制或禁止遮蔽 | 基類專案可以指定 MustOverride、 NotOverridable或 Overridable |
| 關鍵詞使用方式 |
Shadows 在衍生類別中建議使用; 假設未指定Shadows或ShadowsOverrides |
Overridable 或 MustOverride 為基類的必要條件; Overrides 為衍生類別中的必要條件 |
| 從從您已衍生的類別衍生出來的類別中,元素重新定義的繼承 | 進一步派生類別繼承的被覆蓋的元素;被覆蓋的元素仍然隱藏3 | 覆寫由進一步衍生類別繼承的專案;覆寫的專案仍被覆寫 |
1呼叫序列包含項目類型 (Function、 或 SubOperator), 名稱、 Property參數清單和傳回類型。 您無法使用 屬性或其他方式覆寫程式。 您無法以另一種類型覆寫一種程式 (Function、 Sub或 Operator) 。
2 如果您未指定 Shadows 或 Overrides,編譯程式會發出警告訊息,以協助您確定要使用的重新定義類型。 如果您忽略警告,則會使用陰影機制。
3 如果在進一步的衍生類別中無法存取遮蔽元素,則遮蔽行為不會被繼承。 例如,如果您將陰影專案宣告為 Private,衍生自衍生類別的類別會繼承原始專案,而不是陰影專案。
指導方針
您通常會在下列情況下使用覆寫:
您正在定義多型衍生類別。
您想要讓編譯程式強制執行相同的元素類型和呼叫序列的安全性。
您通常會在下列情況下使用陰影:
您預期您的基類可能會遭到修改,並且您需要定義一個與您相同名稱的元素。
您要變更項目類型或呼叫序列的自由。