Ключевое слово "Перегрузки" в VB.NET
Вам действительно нужно это ключевое слово для перегрузки методов? В чем разница между использованием ключевого слова перегрузки или просто наличием разных сигнатур методов?
Ответы
Ответ 1
Внутри одного класса ключевое слово 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
Это показывает высокие результаты 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
Здесь некоторая информация о том, как это компилируется по-разному в CLI.
Ответ 3
Это было соображение дизайна. Конечно, это (VB) могло быть спроектировано так, чтобы вызывать перегрузку с помощью сигнатуры функции (например, на С#) - поэтому ключевое слово Overloads могло быть опущено, но в конце концов оно просто соответствует выразительности Visual Basic (что некоторые считают накладными расходами) и это было только решение для языкового дизайна.
Ответ 4
Мики 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 в свой метод, либо удалить его из другого метода.
Я лично никогда не объявляю перегруженный метод Перегрузки, если у меня нет выбора, как в ситуации выше.
Ответ 5
Я столкнулся с ситуацией, когда мне нужно было использовать ключевое слово Overloads.
У меня был родительский класс и унаследованный класс.
Public Class DataManager
Public MustOverride Function LoadDataSet(ByVal TableName as String, ByVal SQL as SQLObject) as DataSet
Public Function LoadDataSet(ByVal TableName as String, ByVal SQL as String) as DataSet
Return LoadDataSet(TableName, new SQLObject(SQL))
End Function
End Class
Public Class OracleDataManager
Inherits DataManager
Public Overloads Overrides Function LoadDataSet(ByVal TableName as String, ByVal SQLObj as SQLObject) as DataSet
// code here
End Function
End Class
В этом примере мне пришлось использовать ключевое слово перегрузки.
Ответ 6
Overloads
-Ключевое слово полностью необязательно - я не вижу преимуществ при его использовании.