VB.NET中的“Overloads”关键字

时间:2009-07-23 17:22:42

标签: vb.net methods

你真的需要这个关键字来重载方法吗?使用overloads关键字与仅使用不同的方法签名有什么区别?

6 个答案:

答案 0 :(得分:17)

这在Google搜索结果中显示得很高,我认为这里可以更清楚地解释。

当您在同一个类中重载各种方法时,没有理由使用Overloads关键字。使用Overloads的主要原因是允许派生类从其基类调用方法,该方法与重载方法具有相同的名称,但签名不同。

假设您有两个类FooSonOfFoo,其中SonOfFoo继承自Foo。如果Foo实现了一个名为DoSomething的方法而SonOfFoo实现了具有相同名称的方法,那么SonOfFoo方法将隐藏父类的实现...即使这两种方法采用不同的参数。指定Overloads关键字将允许派生类调用父类的方法重载。

以下是一些代码,用于演示上述内容,其中包含按所述实现的类FooSonOfFoo,以及使用{BarSonOfBar的另一对类OverloadsClass Foo Public Sub DoSomething(ByVal text As String) Console.WriteLine("Foo did: " + text) End Sub End Class Class SonOfFoo Inherits Foo Public Sub DoSomething(ByVal number As Integer) Console.WriteLine("SonOfFoo did: " + number.ToString()) End Sub End Class Class Bar Public Sub DoSomething(ByVal text As String) Console.WriteLine("Bar did: " + text) End Sub End Class Class SonOfBar Inherits Bar Public Overloads Sub DoSomething(ByVal number As Integer) Console.WriteLine("SonOfBar did: " + number.ToString()) End Sub End Class Sub Main() Dim fooInstance As Foo = New SonOfFoo() 'works fooInstance.DoSomething("I'm really a SonOfFoo") 'compiler error, Foo.DoSomething has no overload for an integer fooInstance.DoSomething(123) Dim barInstance As Bar = New SonOfBar() 'works barInstance.DoSomething("I'm really a SonOfBar") 'compiler error, Bar.DoSomething has no overload for an integer barInstance.DoSomething(123) Dim sonOfFooInstance As New SonOfFoo() 'compiler error, the base implementation of DoSomething is hidden and cannot be called sonOfFooInstance.DoSomething("I'm really a SonOfFoo") 'works sonOfFooInstance.DoSomething(123) Dim sonOfBarInstance As New SonOfBar() 'works -- because we used the Overloads keyword sonOfBarInstance.DoSomething("I'm really a SonOfBar") 'works sonOfBarInstance.DoSomething(123) End Sub {1}}关键字:

{{1}}

以下是关于如何在CLI中进行不同编译的some information

答案 1 :(得分:16)

在同一个类中,Overloads关键字是可选的,但如果声明了一个方法OverloadsOverrides,则必须将其用于该方法的所有重载。

' this is okay
Sub F1(s as String)
Sub F1(n as Integer)

' This is also okay
Overloads Sub F2(s as String)
Overloads Sub F2(n as Integer)

' Error
Overloads Sub F3(s as String)
Sub F3(n as Integer)

然而,当您在派生类中重载基类方法时,它会变得更加复杂。

如果基类有多个重载方法,并且您希望在派生类中添加重载方法,那么必须使用Overloads关键字在派生类中标记该方法,否则所有重载方法都在基类在派生类中不可用。

有关详细信息,请参阅MSDN

答案 2 :(得分:9)

这是一个设计考虑因素。当然它(VB)可能被设计为通过函数签名推断过载(比如在C#中) - 所以Overloads关键字本身可能已被省略但最终它符合Visual Basic的表现力(有些人认为是开销)这只是一种语言设计决定。

答案 3 :(得分:3)

Miky D是对的。声明Overloads的重载方法与不重载的方法之间没有区别。

我只是想指出,当声明具有相同名称的另一个方法覆盖或重载时,必须使用Overloads关键字。例如,如果您覆盖Equals方法,如下所示:

Public Overrides Function Equals(ByVal obj As Object) As Boolean ...

然后你想要创建一个像这样的重载:

Public Function Equals(ByVal otherProduct As Product) As Boolean ...

您将收到以下错误:

"function 'Equals' must be declared 'Overloads' because another 'Equals' 
is declared 'Overloads' or 'Overrides'."

如果有人将方法声明为Overloads,并且您想要重载该方法,则会收到相同的错误。您必须将Overloads关键字添加到方法中,或者从其他方法中删除它。

我个人从未声明重载方法Overloads,除非我没有选择,就像上面的情况一样。

答案 4 :(得分:2)

答案 5 :(得分:0)

Overloads - 关键字是完全可选的 - 我没有看到使用它的优势。