Поделиться через


Перегруженные свойства и методы (Visual Basic)

Перегрузка — создание нескольких процедур, конструктора экземпляра или свойства в классе с одинаковым именем, но разными типами аргументов.

Чрезмерное использование

Перегрузка особенно полезна, если объектная модель диктует одинаковые имена для процедур, работающих с различными типами данных. Например, класс, который может отображать несколько различных типов данных, может иметь Display процедуры, которые выглядят следующим образом:

Overloads Sub Display(ByVal theChar As Char)
    ' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
    ' Add code that displays Integer data.
End Sub
Overloads Sub Display(ByVal theDouble As Double)
    ' Add code that displays Double data.
End Sub

Без перегрузки необходимо создать отдельные имена для каждой процедуры, даже если они выполняют то же самое, как показано далее:

Sub DisplayChar(ByVal theChar As Char)
    ' Add code that displays Char data.
End Sub
Sub DisplayInt(ByVal theInteger As Integer)
    ' Add code that displays Integer data.
End Sub
Sub DisplayDouble(ByVal theDouble As Double)
    ' Add code that displays Double data.
End Sub

Перегрузка упрощает использование свойств или методов, так как предоставляет выбор типов данных, которые можно использовать. Например, перегруженный Display метод, описанный ранее, можно вызвать с помощью любой из следующих строк кода:

' Call Display with a literal of type Char.
Display("9"c)
' Call Display with a literal of type Integer.
Display(9)
' Call Display with a literal of type Double.
Display(9.9R)

Во время выполнения Visual Basic вызывает правильную процедуру на основе типов данных указанных параметров.

Правила перегрузки

Вы создаете перегруженный член для класса, добавив два или более свойств или методов с одинаковым именем. За исключением производных членов с перегрузкой, каждый перегруженный член должен иметь разные списки параметров, и следующие элементы нельзя использовать в качестве отличительной характеристики при перегрузке свойства или процедуры:

  • Модификаторы, например ByVal или ByRef, которые применяются к члену или параметрам элемента.

  • Имена параметров

  • Возвращаемые типы процедур

Ключевое Overloads слово является необязательным при перегрузке, но если какой-либо перегруженный член использует Overloads ключевое слово, то все остальные перегруженные члены с тем же именем также должны указывать это ключевое слово.

Производные классы могут скрывать наследуемые элементы членами с идентичными параметрами и типами параметров, процесс, известный как скрытие по имени и сигнатуре. Overloads Если ключевое слово используется при сокрытии по имени и сигнатуре, будет использоваться реализация производного класса вместо реализации в базовом классе, и все остальные перегрузки для этого члена будут доступны экземплярам производного класса.

Overloads Если ключевое слово опущено при перегрузке унаследованного члена членом, который имеет идентичные параметры и типы параметров, перегрузка называется скрытием по имени. Скрытие по имени заменяет унаследованную реализацию члена и делает все остальные перегрузки недоступными для экземпляров производного класса и его потомков.

Модификаторы Overloads и Shadows не могут использоваться одновременно с одним и тем же свойством или методом.

Пример

В следующем примере создаются перегруженные методы, принимающие String или Decimal представление суммы доллара и возвращающие строку, содержащую налог на продажу.

Использование этого примера для создания перегруженного метода

  1. Откройте новый проект и добавьте класс с именем TaxClass.

  2. Добавьте в класс TaxClass приведенный далее код.

    Public Class TaxClass
        Overloads Function TaxAmount(ByVal decPrice As Decimal,
             ByVal TaxRate As Single) As String
            TaxAmount = "Price is a Decimal. Tax is $" &
               (CStr(decPrice * TaxRate))
        End Function
    
        Overloads Function TaxAmount(ByVal strPrice As String,
              ByVal TaxRate As Single) As String
            TaxAmount = "Price is a String. Tax is $" &
               CStr((CDec(strPrice) * TaxRate))
        End Function
    End Class
    
  3. Добавьте следующую процедуру в форму.

    Sub ShowTax()
        ' 8% tax rate.
        Const TaxRate As Single = 0.08
        ' $64.00 Purchase as a String.
        Dim strPrice As String = "64.00"
        ' $64.00 Purchase as a Decimal.
        Dim decPrice As Decimal = 64
        Dim aclass As New TaxClass
        'Call the same method with two different kinds of data.
        MsgBox(aclass.TaxAmount(strPrice, TaxRate))
        MsgBox(aclass.TaxAmount(decPrice, TaxRate))
    End Sub
    
  4. Добавьте кнопку в форму и вызовите процедуру ShowTax из события нажатия кнопки Button1_Click.

  5. Запустите проект и нажмите кнопку в форме, чтобы проверить перегруженную ShowTax процедуру.

Во время выполнения компилятор выбирает соответствующую перегруженную функцию, которая соответствует используемым параметрам. При нажатии кнопки перегруженный метод вызывается сначала с Price параметром, который является строкой, и сообщением "Цена является строкой. Отображается налог: $5,12. TaxAmount вызывается с Decimal значением во второй раз и сообщением "Цена является десятичным числом. Отображается налог: $5,12.

См. также