gpt4 book ai didi

.net - 我应该使用什么?覆盖还是重载?

转载 作者:行者123 更新时间:2023-12-01 01:00:30 24 4
gpt4 key购买 nike

我只是在读一本关于 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

给我相同的输出。

最佳答案

第一个片段让我惊呼“啊?”我不得不在 VB.NET 语言规范中查找它。它确实有效,它是遮蔽、隐藏继承的名称。您通常会为此使用 Shadows 关键字,但 Overloads 也是正确的,它执行不同类型的隐藏。 Shadows 仅隐藏具有完全相同签名的继承成员,Overloads 隐藏具有相同名称的所有内容,包括基类中所有具有相同名称的重载。

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

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

这通常不是故意的,您希望调用 ClsTest2.addition(),因为该对象实际上是 ClsTest2 类型。使用虚拟方法时可以避免的问题,就像您在第二个代码段中所做的那样。然后您将获得 ClsTest2.addition(),无论对象引用类型如何。如果您不确定自己想要什么,请选择这个。

关于.net - 我应该使用什么?覆盖还是重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23858389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com