隐藏和重写之间的差异 (Visual Basic)

在定义继承自基类的类时,有时需要重新定义派生类中的一个或多个基类元素。 隐藏和重写都可用于此目的。

比较

当派生类从基类继承时使用隐藏和重写两种方法,并且它们都将一个已声明的元素重新定义为另一个。 但两者之间存在显著差异。

下表对隐藏和重写进行了比较。

比较点 阴影操作 替代
目的 防止后续基类修改,它会引入已在派生类中定义的成员 通过定义具有相同调用序列的过程或属性的不同实现来实现多形性1
已定义的元素 任何声明的元素类型 仅过程(FunctionSubOperator)或属性
要重新定义的元素 任何声明的元素类型 仅具有相同调用序列的过程或属性1
要重新定义元素的访问级别 任何访问级别 无法更改已重写元素的访问级别
要重新定义元素的可读性和可写性 任意组合 无法更改已重写属性的可读性或可写性
通过重新定义进行控制 基类元素无法强制或禁止隐藏 基类元素可以指定 MustOverrideNotOverridableOverridable
关键字用法 在派生类中推荐使用 Shadows;如果 ShadowsOverrides 都未指定,则假定为 Shadows2 OverridableMustOverride 在基类中是必需的;Overrides 在派生类中是必需的
由派生类派生的类继承要重新定义的元素 由进一步的派生类继承的要隐藏元素;已隐藏元素仍处于隐藏状态3 由进一步的派生类继承的要重写元素;已重写元素仍处于重写状态

1“调用序列”由元素类型(FunctionSubOperatorProperty)、名称、参数列表和返回类型组成。 不能使用属性或其他方法来重写过程。 不能用一类过程来重写另一类过程(FunctionSubOperator)。

2 如果未指定 ShadowsOverrides,则编译器会发出警告消息,帮助你确定要使用哪种重定义。 如果忽略该警告,则使用隐藏机制。

3 如果无法在进一步的派生类中访问要隐藏的元素,则不会继承隐藏。 例如,如果将要隐藏元素声明为 Private,派生自派生类的类将继承原始元素,而不是要隐藏元素。

指南

在以下情况下,通常使用重写:

  • 你要定义多形派生类。

  • 你希望安全地让编译器强制使用相同的元素类型和调用序列。

在以下情况下,通常使用隐藏:

  • 你希望修改基类,并使用与你名字相同的名称来定义元素。

  • 你希望随意更改元素类型或调用序列。

另请参阅