你真的需要这个关键字来重载方法吗?使用overloads关键字与仅使用不同的方法签名有什么区别?
答案 0 :(得分:17)
这在Google搜索结果中显示得很高,我认为这里可以更清楚地解释。
当您在同一个类中重载各种方法时,没有理由使用Overloads
关键字。使用Overloads
的主要原因是允许派生类从其基类调用方法,该方法与重载方法具有相同的名称,但签名不同。
假设您有两个类Foo
和SonOfFoo
,其中SonOfFoo
继承自Foo
。如果Foo
实现了一个名为DoSomething
的方法而SonOfFoo
实现了具有相同名称的方法,那么SonOfFoo
方法将隐藏父类的实现...即使这两种方法采用不同的参数。指定Overloads
关键字将允许派生类调用父类的方法重载。
以下是一些代码,用于演示上述内容,其中包含按所述实现的类Foo
和SonOfFoo
,以及使用{Bar
和SonOfBar
的另一对类Overloads
和Class 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
关键字是可选的,但如果声明了一个方法Overloads
或Overrides
,则必须将其用于该方法的所有重载。
' 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
- 关键字是完全可选的 - 我没有看到使用它的优势。