隐藏和重写之间的差异

更新:2007 年 11 月

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

比较

隐藏和重写很容易混淆。二者都在派生类继承基类时使用,并且都是用另外的元素重定义一个已声明的元素。但二者之间有重大区别。

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

比较点

隐藏

重写

用途

防止后续的基类修改引入已在派生类中定义的成员

通过用同一调用序列定义不同的过程或属性实现来获得多态性1

重定义的元素

任何声明的元素类型

只能是过程(Function、Sub 或 Operator)或属性

重定义元素

任何声明的元素类型

只能是具备相同的调用序列的过程或属性1

重定义元素的访问级别

任何访问级别

不能更改被重写的元素的访问级别

重定义元素的可读性和可写性

任何组合

不能更改被重写的属性的可读性或可写性

控制重定义

基类元素不能强制或禁止隐藏

基类元素可以指定 MustOverride、NotOverridable 或 Overridable

关键字的用法

建议在派生类中使用 Shadows;若既没有指定 Shadows 也没有指定 Overrides,则假定为 Shadows2

基类中要求 Overridable 或 MustOverride;派生类中要求 Overrides

由派生类派生的类实现的重定义元素继承

隐藏其他派生类继承的元素;隐藏的元素仍被隐藏3

重写其他派生类继承的元素;重写的元素仍被重写

1“调用序列”包括元素类型(Function、Sub、Operator 或 Property)、名称、参数列表和返回类型。不能用属性重写过程,或是用过程重写属性。您不能用一种过程重写另一种过程(Function、Sub 或 Operator)。

2 如果不指定 Shadows 或 Overrides,则编译器会发出一条警告消息,以帮助您确定要使用哪种重定义。如果忽略该警告,则使用隐藏机制。

3 若隐藏元素在后来的派生类中不可访问,则没有继承隐藏。例如,如果将隐藏元素声明为 Private,则从派生类派生的类就会继承原始元素而不是隐藏元素。

准则

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

  • 您要定义多态性派生类。

  • 您需要安全地让编译器强制执行相同元素类型和调用序列。

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

  • 您希望可以修改基类并使用您的名称定义元素。

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

请参见

任务

如何:区分两个名称相同的元素

如何:隐藏与您的变量同名的变量

如何:隐藏继承的变量

如何:访问被派生类隐藏的变量

概念

有多个同名变量时解析引用

Visual Basic 中的隐藏

参考

Shadows

Overrides

其他资源

对已声明元素的引用