为什么在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我没有足够的声誉。