隐藏和重写之间的差异 (Visual Basic)
在定义继承自基类的类时,有时需要重新定义派生类中的一个或多个基类元素。 隐藏和重写都可用于此目的。
比较
当派生类从基类继承时使用隐藏和重写两种方法,并且它们都将一个已声明的元素重新定义为另一个。 但两者之间存在显著差异。
下表对隐藏和重写进行了比较。
比较点 | 阴影操作 | 替代 |
---|---|---|
目的 | 防止后续基类修改,它会引入已在派生类中定义的成员 | 通过定义具有相同调用序列的过程或属性的不同实现来实现多形性1 |
已定义的元素 | 任何声明的元素类型 | 仅过程(Function 、Sub 或 Operator )或属性 |
要重新定义的元素 | 任何声明的元素类型 | 仅具有相同调用序列的过程或属性1 |
要重新定义元素的访问级别 | 任何访问级别 | 无法更改已重写元素的访问级别 |
要重新定义元素的可读性和可写性 | 任意组合 | 无法更改已重写属性的可读性或可写性 |
通过重新定义进行控制 | 基类元素无法强制或禁止隐藏 | 基类元素可以指定 MustOverride 、NotOverridable 或 Overridable |
关键字用法 | 在派生类中推荐使用 Shadows ;如果 Shadows 和 Overrides 都未指定,则假定为 Shadows 2 |
Overridable 或 MustOverride 在基类中是必需的;Overrides 在派生类中是必需的 |
由派生类派生的类继承要重新定义的元素 | 由进一步的派生类继承的要隐藏元素;已隐藏元素仍处于隐藏状态3 | 由进一步的派生类继承的要重写元素;已重写元素仍处于重写状态 |
1“调用序列”由元素类型(Function
、Sub
、Operator
或 Property
)、名称、参数列表和返回类型组成。 不能使用属性或其他方法来重写过程。 不能用一类过程来重写另一类过程(Function
、Sub
或 Operator
)。
2 如果未指定 Shadows
或 Overrides
,则编译器会发出警告消息,帮助你确定要使用哪种重定义。 如果忽略该警告,则使用隐藏机制。
3 如果无法在进一步的派生类中访问要隐藏的元素,则不会继承隐藏。 例如,如果将要隐藏元素声明为 Private
,派生自派生类的类将继承原始元素,而不是要隐藏元素。
指南
在以下情况下,通常使用重写:
你要定义多形派生类。
你希望安全地让编译器强制使用相同的元素类型和调用序列。
在以下情况下,通常使用隐藏:
你希望修改基类,并使用与你名字相同的名称来定义元素。
你希望随意更改元素类型或调用序列。