【问题标题】:What should I use? Override or Overload?我应该使用什么?覆盖还是重载?
【发布时间】:2014-05-26 03:06:07
【问题描述】:

我刚刚阅读了一本关于 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

给我同样的输出。

【问题讨论】:

  • 你的第一个例子并没有向我展示我理解的任何东西的“超载”。是不是少了什么东西?
  • 也许我只是不明白,但我是一个初学者,所以提前很抱歉,但在第一个示例中,我使用相同的方法名称和相同的签名从子类重载了基类方法。那不是超载吗?我知道 Overloads 是可选的,但这不是重点,不是吗?关键是,如果我可以用两个不同的概念实现同样的事情,我应该使用什么?
  • 据我了解,这并没有超载。这看起来像是 VB.NET 案例之一:stackoverflow.com/a/7880470/745969
  • 谢谢蒂姆!好的,根据您发布的答案:“如果您改用 OVERLOADS 关键字,它只会隐藏具有相同签名的基类方法。”所以结果是一样的,但是发生了一些完全不同的事情。但是既然结果是一样的,那后果是什么。下次我想改变基类方法的行为(如果子类有相同的方法和相同的签名),我应该使用第一个还是第二个概念?

标签: .net vb.net oop


【解决方案1】:

第一个 sn-p 让我惊呼“嗯?”我必须在 VB.NET 语言规范中查找它。它确实有效,它是遮蔽,隐藏继承的名称。您通常会为此使用 Shadows 关键字,但 Overloads 也是正确的,它进行了不同类型的隐藏。 Shadows 只隐藏具有完全相同签名的继承成员,Overloads 隐藏所有同名的东西,包括基类中所有同名的重载。

我不太清楚阴影是否是您真正想到的。这是非常危险的,它有一个诀窍是调用错误的方法。根据对象引用类型,您将获得编译器认为要调用的方法。奇怪的情况是:

  Dim obj As ClsTest
  obj = new ClsTest2
  obj.addition(42)     '' Calls ClsTest.addition

这不是经常打算的,您会期望调用 ClsTest2.addition(),因为该对象实际上是 ClsTest2 类型。当您使用虚拟方法时可以避免的问题,就像您在第二个 sn-p 中所做的那样。然后,无论对象引用类型如何,您都会获得 ClsTest2.addition()。如果你不确定你想要什么,那就选择这个。

【讨论】:

  • 非常感谢您的精彩解释!
  • 呃,我希望基类被调用;)阴影对于覆盖默认 winforms 控件的基本属性/成员很方便。您始终可以从影子副本中调用基本成员。但这是一个很好的例子:)
猜你喜欢
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 2021-05-08
相关资源
最近更新 更多