我正在阅读一本关于OOP(J.P.Hamilton的面向对象的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
给了我相同的输出。
答案 0 :(得分:4)
第一个片段让我惊呼“嗯?”我不得不在VB.NET语言规范中查找它。它确实有效,它是 shadowing ,隐藏了继承的名称。您通常会使用 Shadows 关键字,但 Overloads 也是正确的,它会执行不同类型的隐藏。 Shadows 仅隐藏具有完全相同签名的继承成员, Overloads 隐藏具有相同名称的所有内容,包括基类中具有相同名称的所有重载。
我不太清楚影子是否是你真正想到的。它非常危险,它具有获取错误方法的诀窍。根据对象引用类型,您可以获得要调用的编译器认为的方法。奇怪的情况是:
Dim obj As ClsTest
obj = new ClsTest2
obj.addition(42) '' Calls ClsTest.addition
这通常不打算,因为对象实际上是ClsTest2类型,所以你希望调用ClsTest2.addition()。使用虚拟方法时避免的问题,就像您在第二个片段中所做的那样。然后,无论对象引用类型如何,您都可以获得ClsTest2.addition()。如果你不确定你想要什么,那就选择这个。