我只是读了一本关于OOP的书(JPHamilton编写的使用Visual Basic .NET进行面向对象的编程)。在他解释了重载但尚未覆盖的地方,他写道:“您只能在类中重载方法;这就是说,您可以添加与现有方法同名的新方法。但是,现有行为无法重新定义。 ”
但是据我了解,您可以使用重载从子类重新定义方法,例如:
Public Class clsTest
Sub addition(ByVal x As Integer)
MsgBox(x)
End Sub
End Class
Public Class clsTest2 : Inherits clsTest
Overloads Sub addition(ByVal x As Integer)
MsgBox(x * x)
End Sub
End Class
如果这是正确的,那么我想知道何时使用重载以及何时使用重写来重定义方法,因为
Public Class clsTest
Overridable Sub addition(ByVal x As Integer)
MsgBox(x)
End Sub
End Class
Public Class clsTest2 : Inherits clsTest
Overrides Sub addition(ByVal x As Integer)
MsgBox(x * x)
End Sub
End Class
给我相同的输出。
第一个片段使我惊呼“嗯?” 我必须在VB.NET语言规范中进行查找。这确实是有效的,它在隐藏继承的名称的同时隐藏了阴影。您通常会为此使用Shadows关键字,但是Overloads也是正确的,它会进行另一种隐藏。Shadows仅隐藏具有完全相同签名的继承成员,Overloads隐藏具有相同名称的所有内容,包括基类中具有相同名称的所有重载。
对于我来说,尚不清楚阴影是否是您真正想到的。这是非常危险的,它知道要调用错误的方法。根据对象引用类型,您将获得编译器认为要调用的方法。古怪的情况是:
Dim obj As ClsTest
obj = new ClsTest2
obj.addition(42) '' Calls ClsTest.addition
这并不是经常要这样做的,您希望调用ClsTest2.addition(),因为该对象实际上是ClsTest2类型的。使用虚拟方法时可以避免的问题,就像在第二个片段中一样。然后,无论对象引用类型如何,都将获得ClsTest2.addition()。如果您不确定想要什么,请选择此菜单。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句