2009-07-23 2 views

ответ

15

В этом же классе ключевое слово 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.

+1

Ах, один из этих бесполезных ключевых слов VB.NET, таких как «ReadOnly» для свойства «Необязательный» для необязательного параметра или «ByVal»: D –

+0

@RayKoopa Yup! (но «Необязательно» необязательно: D) – unnknown

+0

Да, к сожалению, это так. Между тем, я поговорил с разработчиком VB-языка в VS Uservoice, и причина его сохранения в том, что язык должен поддерживать среду IDE при автоматическом создании заглушек свойств или других вещей (например, только заглушку Get, если вы пишете «ReadOnly»). Фактически, VB предназначен для поддержки IDE, это не IDE, предназначенная для поддержки VB. Weird! –

9

Это было соображение дизайна. Конечно, это (VB) могло быть спроектировано так, чтобы вызывать перегрузку с помощью сигнатуры функции (например, на C#) - поэтому ключевое слово Overloads могло быть опущено, но в конце концов оно просто соответствует выразительности Visual Basic (что некоторые считают накладными расходами) и это было только решение для языкового дизайна.

+0

ОП задает вопрос о том, почему перегружать (vs имеет разные имена для методов), а не зачем использовать ключевое слово перегрузки. –

+4

@Adrian Godong: OP задает вопрос о необходимости наличия ключевого слова «Перегрузки» в VB - не полезно ли перегрузка (в отличие от использования только разных имен методов) –

+0

@Adrian: Это неправильно - он спрашивает о ключевом слове – Dario

0

Overloads -Ключевое слово полностью необязательно - я не вижу преимуществ при его использовании.

+0

ОП задает вопрос о том, зачем перегружать (vs имеет разные имена для методов), а не зачем использовать ключевое слово перегрузки. –

+0

Это неверно: он спрашивает о ключевом слове: он не говорит об именах, но подписях, мы называем это перегрузкой – Dario

3

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 в свой метод, либо удалить его из другого метода.

Я лично никогда не объявляю перегруженный метод Перегрузки, если у меня нет выбора, как в ситуации выше.

2

Я столкнулся с ситуацией, когда мне нужно было использовать ключевое слово 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 

В этом примере мне пришлось использовать ключевое слово перегрузки.

15

Это показывает высокие результаты 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.

+0

Значением по умолчанию является «Shadows». –

+19

Я должен быть самым забывчивым человеком в мире; Я приехал сюда из поиска Google и в конце концов ударил себя по лицу, когда увидел свой собственный ответ. –

+0

Как насчет функций? Не могли бы вы что-то добавить? – beppe9000

Смежные вопросы