为什么在VB.NET中不能声明一个不可重写的方法?

为什么在VB.NET中不能声明一个不可重写的方法?,vb.net,inheritance,Vb.net,Inheritance,我试图避免我的类的子类可以重写我的方法 如果我尝试使用NotOverridable关键字执行此操作: Public Class Class1 Protected NotOverridable Sub DoSomething() End Sub End Class 我得到这个错误: 'NotOverridable' cannot be specified on methods that do not override another method 假设你有这样一门课: 公共类祖

我试图避免我的类的子类可以重写我的方法

如果我尝试使用
NotOverridable
关键字执行此操作:

Public Class Class1
    Protected NotOverridable Sub DoSomething()
    End Sub
End Class
我得到这个错误:

'NotOverridable' cannot be specified on methods that do not override another method

假设你有这样一门课:

公共类祖父母
受保护的子方法1()
端接头
受保护的可重写子方法2()
端接头
末级
然后你有这个课程:

公共类父类
祖父母
受保护的子方法1()
端接头
受保护的重写子方法2()
端接头
末级
如图所示,
Parent.Method2
覆盖了
GrandParent.Method2
。另一方面,
Parent.Method1
没有覆盖
GrandParent.Method1
。该代码生成以下警告:

子“Method1”隐藏在基中声明的可重载成员 “祖父母”班。如果要重载基本方法,请执行以下操作 方法必须声明为“重载”

如果将代码更改为以下内容:

公共类父类
祖父母
受保护的重写子方法1()
端接头
受保护的重写子方法2()
端接头
末级
然后会出现以下错误:

“受保护的重写子方法1()”无法重写“受保护的子方法” Method1(),因为它未声明为“可重写”

阴影不同于重载,因为阴影尊重引用的类型,而重写尊重对象的类型。这意味着,如果将
父对象
分配给
祖父母
变量,则调用
方法1
将根据引用的类型调用
祖父母。方法1
,调用
方法2
将根据对象的类型调用
父方法2
。覆盖在阴影不存在的情况下实现多态性。
Parent
的第一个实现相当于:

公共类父类
祖父母
受保护的阴影子方法1()
端接头
受保护的重写子方法2()
端接头
末级
如果要添加此类,请执行以下操作:

公共类子类
继承父项
受保护的重写子方法2()
端接头
末级
它会像预期的那样工作。如果将
父类更改为该类:

公共类父类
祖父母
受保护的阴影子方法1()
端接头
受保护的不可重写重写子方法2()
端接头
末级
那么`子实现将生成以下错误:

'NotOverridable' cannot be specified on methods that do not override another method
“受保护的重写子方法2()”无法重写“受保护的” NotOverridable重写Sub Method2(),因为它已声明 “不可超越”


这是使用
NotOverridable
关键字的唯一原因,即防止派生类重写您自己的继承成员的重写实现。

NotOverridable
密封的。如果没有什么东西需要密封,那么密封就没有意义了。您可以通过不声明一个不可重写的方法来声明它
Protected Sub-DoSomething()
是不可重写的。我尝试了这一点,但在子类中可以重写该方法:
Public class Class2继承Class1 Protected重载Sub-DoSomething()End Sub-End class
不,这是不可能的。几乎可以肯定的是,您正在对该方法进行跟踪。为了覆盖,您实际上必须使用
覆盖
关键字。重载不是覆盖。@Couper是的,您可以。@GSerg我没有足够的声誉。