编程VB.NET 开发者

如何在 Visual Basic 中实现带有继承和多态的类层次结构?描述如何正确使用虚拟方法(Overridable/Overrides),并提供一个包含基类和派生类的代码示例。

用 Hintsage AI 助手通过面试

答案

在 Visual Basic .NET 中,继承通过 Inherits 关键字实现。它允许创建实现公共和可重写方法及属性的类层次结构。

为了支持多态,基类中的方法使用 Overridable 修饰符声明,而在派生类中使用 Overrides 进行重写。为了防止进一步重写,可以使用修饰符 NotOverridable

示例:

' 基类 Animal 和虚拟方法 Public Class Animal Public Overridable Sub Speak() Console.WriteLine("动物发出声音.") End Sub End Class ' 派生类 Dog 重写 Speak Public Class Dog Inherits Animal Public Overrides Sub Speak() Console.WriteLine("狗叫.") End Sub End Class Sub Main() Dim a As Animal = New Dog() a.Speak() ' 输出: 狗叫. End Sub

考题

问:在 Visual Basic .NET 中是否可以重写未在基类中声明为 Overridable/Abstract 的方法?

答:不能。只有标记为 Overridable 的方法或通过接口/抽象声明的方法可以在继承时重写。尝试对普通方法使用 Overrides 会导致编译错误。

' 错误: Public Class A Public Sub Foo() End Sub End Class Public Class B Inherits A Public Overrides Sub Foo() ' 编译错误 End Sub End Class

故事

1. 在一个与微服务架构相关的实际项目中,团队中新成员在基类控制器中将虚拟方法声明为普通方法(未使用 Overridable)。后来,另一位开发人员尝试重写该方法进行特殊处理。结果导致代码逻辑重复和错误,因为父类实现始终被调用,尽管派生类中已经存在该方法。


故事

2. 架构设计不充分和未使用多态导致数百行冗余代码:在需要添加新的继承者时,必须重写基类方法的大部分,而不仅仅是实现所需的 Override。这使得维护和支持变得复杂。


故事

3. 企业应用程序的案例:在迁移到 .NET Core 时,开发人员将方法标记为 Overridable,但错误地未添加接口的 Implements。结果,继承层次中的方法解析出现模糊,导致通过接口引用调用时出现问题,造成功能失效。