Вам действительно нужно это ключевое слово для перегрузки методов? В чем разница между использованием ключевого слова перегрузки или просто наличием разных сигнатур методов?ключевое слово «Перегрузки» в VB.NET
ответ
В этом же классе ключевое слово 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.
Это было соображение дизайна. Конечно, это (VB) могло быть спроектировано так, чтобы вызывать перегрузку с помощью сигнатуры функции (например, на C#) - поэтому ключевое слово Overloads могло быть опущено, но в конце концов оно просто соответствует выразительности Visual Basic (что некоторые считают накладными расходами) и это было только решение для языкового дизайна.
ОП задает вопрос о том, почему перегружать (vs имеет разные имена для методов), а не зачем использовать ключевое слово перегрузки. –
@Adrian Godong: OP задает вопрос о необходимости наличия ключевого слова «Перегрузки» в VB - не полезно ли перегрузка (в отличие от использования только разных имен методов) –
@Adrian: Это неправильно - он спрашивает о ключевом слове – Dario
Overloads
-Ключевое слово полностью необязательно - я не вижу преимуществ при его использовании.
ОП задает вопрос о том, зачем перегружать (vs имеет разные имена для методов), а не зачем использовать ключевое слово перегрузки. –
Это неверно: он спрашивает о ключевом слове: он не говорит об именах, но подписях, мы называем это перегрузкой – Dario
Miky D является правильным. Нет никакой разницы между перегруженным методом, объявленным перегрузками, и другим, который этого не делает.
Я просто хотел указать, что ключевое слово 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.
У меня был родительский класс и унаследованный класс.
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
В этом примере мне пришлось использовать ключевое слово перегрузки.
Это показывает высокие результаты 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
Вот some information на том, как это компилирует иначе в CLI.
Значением по умолчанию является «Shadows». –
Я должен быть самым забывчивым человеком в мире; Я приехал сюда из поиска Google и в конце концов ударил себя по лицу, когда увидел свой собственный ответ. –
Как насчет функций? Не могли бы вы что-то добавить? – beppe9000
- 1. Является ли ключевое слово «Перегрузки» когда-либо требуемым в VB.Net?
- 2. Зарезервированное ключевое слово в vb.net?
- 3. C# Метод перегрузки против Param Ключевое слово
- 4. Что такое ключевое слово App_Path в vb.net?
- 5. Sql серверное ключевое слово в vb.net
- 6. Что означает ключевое слово «Shared» в VB.NET?
- 7. VB.NET - Ключевое слово не поддерживается: поставщик
- 8. C++ - сопзЬ ключевое слово в методах и перегрузки
- 9. Javascript использует ключевое слово var ключевое слово?
- 10. ключевое слово синхронизации и волатильное ключевое слово
- 11. перегрузки в vb.net
- 12. - ключевое слово в Python
- 13. Удалить ключевое слово table1 из поколения I в vb.net
- 14. vb.net идентифицировать ключевое слово в простом лексическом анализаторе
- 15. Зарезервированное ключевое слово в перечислении в C#
- 16. C# ключевое слово в качестве переменной
- 17. Почему перегруженное ключевое слово удалено из C++?
- 18. Что делает ключевое слово Attribute в VB6?
- 19. ключевое слово `Fault` в блоке try
- 20. Можно ли добавить ключевое слово на C# или VB.NET?
- 21. Является ли ключевое слово 'Is' VB.NET таким же, как Object.ReferenceEquals?
- 22. Глобальное ключевое слово в Visual Basic 2005?
- 23. ключевое слово python continue переключает управление на ключевое слово finally
- 24. svn определяемое пользователем ключевое слово ключевое слово расширение/замена
- 25. Javascript: Имея «Var» ключевое слово перед «этим» ключевое слово
- 26. Оператор перегрузки VB.NET
- 27. Ошибка: «неожиданное ключевое слово else, ожидаемое ключевое слово end»?
- 28. Ключевое слово «наследует» не допускается, если ключевое слово «модель» используется
- 29. перегрузки сервера vb.net
- 30. Java класс ключевое слово
Ах, один из этих бесполезных ключевых слов VB.NET, таких как «ReadOnly» для свойства «Необязательный» для необязательного параметра или «ByVal»: D –
@RayKoopa Yup! (но «Необязательно» необязательно: D) – unnknown
Да, к сожалению, это так. Между тем, я поговорил с разработчиком VB-языка в VS Uservoice, и причина его сохранения в том, что язык должен поддерживать среду IDE при автоматическом создании заглушек свойств или других вещей (например, только заглушку Get, если вы пишете «ReadOnly»). Фактически, VB предназначен для поддержки IDE, это не IDE, предназначенная для поддержки VB. Weird! –