我该怎么用?覆盖或超载?

时间:2014-05-25 18:07:28

标签: .net vb.net oop

我正在阅读一本关于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

给了我相同的输出。

1 个答案:

答案 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()。如果你不确定你想要什么,那就选择这个。