【问题标题】:Overloads keyword in VB.Net在 VB.Net 中重载关键字
【发布时间】:2020-12-18 17:35:02
【问题描述】:

您能告诉我为什么在下面的代码中使用 OVERLOADS 关键字时会出现错误吗?我得到的错误如下:

Module Module1
    Sub Main()
        Dim name As String = "Sougata"
        Dim age As Integer = 36
        Console.WriteLine("Name before Age: {0} ", test(name, age))
        Console.WriteLine("Age before Name: {0}", test(age, name))
        Console.ReadLine()
    End Sub
    Overloads Function test(ByVal name As String, ByVal age As Integer) As Integer
        Return 1
    End Function
    Overloads Function test(ByVal a As Integer, ByVal n As String) As Integer
        Return 2
    End Function

End Module


【问题讨论】:

  • 因为你在一个模块中。尝试删除 Overloads 关键字。
  • 您要在哪里重载什么函数?你的目标是什么?由于您的模块没有从任何东西继承,它不能重载任何东西。如果你只是想为你的测试函数创建两个签名,你可以简单地用不同的参数类型声明它们,你就完成了。
  • @LarsTech ....如果您点击链接 (docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/…),您将看到声明上下文定义为 >>>“您只能在属性或过程声明语句中使用重载."。没有提到它不能在模块内声明。因此尝试了同样的方法。现在,这是否意味着只有当我在类中重载一个过程时,我才能使用 OVERLOADS 关键字?如果不是,那么使用它时要遵循什么规则?请帮忙。
  • 还可以查看有关此关键字用法的一些非常好的解释。在绝大多数情况下,关键字是可选的。有一些边缘情况是必要的。如果您只是在学习,我建议您不要尝试使用此关键字,而是专注于学习独立于关键字的重载概念。 stackoverflow.com/questions/4038032/…

标签: vb.net


【解决方案1】:

您可能正在尝试创建不同的函数(也称为“方法”)签名,在这种情况下,您不需要Overloads。您可以简单地声明不同的签名:

Function test(ByVal name As String, ByVal age As Integer) As Integer
    Return 1
End Function

Function test(ByVal a As Integer, ByVal n As String) As Integer
    Return 2
End Function

Function test(ByVal b As Boolean, ByVal i As Integer, ByVal n As String) As Integer
    Return 3
End Function

等等

如果您真的想实现方法重载,这里有一个基本示例:

Class BaseClass
    Function Test() As Integer
        Return 1
    End Function
End Class

Class SubClass
    Inherits BaseClass
    Overloads Function Test() As Integer
        Return 2
    End Function
End Class

【讨论】:

  • 其实你的两个场景都是重载场景。我个人喜欢认为这样的类方法将在幕后获得额外的编译器生成的“thisArg”参数。该参数用于将类实例的引用传递给方法,方法中的MeMyBase 关键字将引用该引用。因此,正如我所看到的,这两个 Test 方法都存在于同一范围内,但具有不同的签名:一个采用 BaseClass 类型的“thisArg”参数,另一个采用“thisArg”参数输入SubClass
  • 我还认为您可能将重载与覆盖混淆了。最大的问题是当像这样创建对类实例的引用时预期会发生什么:Dim X As BaseClass = New SubClass(),然后调用X.Test()。在带有重载的代码中,您将获得1,因为X 的类型为BaseClass,因此将调用BaseClass.Test()。对于多态性(返回2,因为实际实例是SubClass 实例),应该应用覆盖,使用Overridable 关键字和BaseClass.Test()Overrides 关键字和@987654340 @.
  • @BartHofland 我正在回应 OP 使用 Overloads 关键字,而不是在上下文中讨论它的使用或适用性等。除此之外,我同意,各种关键字的功能可能会有些混乱。
【解决方案2】:

Overloads 关键字确实有点奇怪。

严格来说,Overloads 关键字始终是可选的。在模块内,根本不允许。正因为如此,而且在指定多个同名方法时重载意图已经很明确,我倾向于认为Overloads关键字只会造成“代码污染”,所以我建议干脆不要指定它。

正如SteveCinq 在他的cmets 中已经指出的那样,在派生类中重载基类的属性或方法时,您将收到编译器警告。恕我直言,该警告非常有用,因为在这种情况下,您实际上可能无法通过重载获得想要的行为。如果您需要具有类继承的运行时多态性,您应该使用属性/方法 overriding 而不是重载。但是,如果实际上打算在派生类中重载基类的属性或方法,当然可以显式指定 OverloadsShadows 关键字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多