隐藏和重写之间的差异 (Visual Basic)
当您定义从基类继承的类时,有时会需要重定义派生类中的一个或多个基类元素。 隐藏和重写均可用于此目的。
比较
隐藏和重写都在派生类继承基类时使用,并且都是用另外的元素重定义一个已声明的元素。 但二者之间有重大区别。
下表对隐藏和重写进行了比较。
比较点 |
Shadowing |
重写 |
用途 |
防止后续的基类修改引入已在派生类中定义的成员 |
通过用同一调用序列定义不同的过程或属性实现来获得多态性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)