阴影和重写之间的差异(Visual Basic)

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

比较

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

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

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

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

2 如果未指定Shadows或Overrides,编译器会发出警告消息,以帮助你确定要使用的重新定义类型。 如果忽略警告,将使用阴影机制。

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

准则

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

  • 你正在定义多态派生类。

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

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

  • 你预计基类可能被修改,并使用与你的相同名称定义元素。

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

另请参阅