在 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。结果,继承层次中的方法解析出现模糊,导致通过接口引用调用时出现问题,造成功能失效。