logo
sranaya_informatika

Переопределение (перегрузка) методов

    Скажу несколько слов о такой "полезной вещи" как перегрузка (переопределение) методов (methods overloading) - в русскоязычной литературе принят дословный перевод - перегрузка, но лично я предпочитаю говорить - переопределение, что снимает множество вопросов новичков. Что это такое? Это возможность создать несколько вариантов одного и того же метода, отличающихся набором параметров. В качестве примера используем конструктор нашего любимого класса "Черный ящик".     Например в одном случае мы хотим сразу же при создании нового экземпляра класса (черного ящика) вырезать название и поместить в него содержимое, а в другом случае мы хотим только вырезать при создании ящика его название, а содержимое поместить потом. В данном случае, какой путь вы изберете, не принципиально, а зависит только от вашего желания и удобства в каждом конкретном случае.

Public Sub New(ByVal NewName As String)

mBoxName = NewName

End Sub

Public Sub New(ByVal NewName As String, ByVal NewContent As String)

mBoxName = NewName

mBoxContent = NewContent

End Sub

    Теперь при создании экземпляра класса можно использовать любой из двух конструкторов.

Dim myBlackBox As BlackBox = New BlackBox("Мой персональный черный ящик")

MessageBox.Show(myBlackBox.Name)

Dim myBlackBox As BlackBox = New BlackBox("Мой персональный черный ящик", "Прошлогодние газеты")

MessageBox.Show(myBlackBox.Name)

    Это справедливо для любого метода (Function или Sub), при этом возвращаемое значение тоже может быть разным.

Public Function OpenBox(ByVal DropContent As Boolean) As Boolean

Dim isSomethingThere As Boolean

...

Return isSomethingThere

End Function

Public Function OpenBox() As Boolean

Dim isSomethingThere As Boolean

...

Return isSomethingThere

End Function

Public Function OpenBox(ByVal WhatToAdd As String) As String

...

Return BoxContent

End Function

    Но, учтите, что функции должны отличаться параметрами, только тогда переопределение происходит, иначе компилятор выдаст ошибку, если вы определите для одинаковые функции отличающиеся лишь типом возвращаемого значения. На практике этого и не нужно, так как значение можно преобразовать.     Также, я должен сказать, что существует способ визуально выделить перегруженные (перегружаемые) методы, добавив к определению каждого ключевое слово Overloads.

Public Overloads Function OpenBox(ByVal DropContent As Boolean) As Boolean

Dim isSomethingThere As Boolean

...

Return isSomethingThere

End Function

Public Overloads Function OpenBox() As Boolean

Dim isSomethingThere As Boolean

...

Return isSomethingThere

End Function

Public Overloads Function OpenBox(ByVal WhatToAdd As String) As String

...

Return BoxContent

End Function

    Если вы используете ключевое слово Overloads хотя бы в одном определении функции, то вы должны использовать его во всех остальных. Зато, просматривая код в будущем, вы сразу же найдете перегруженные (переопределенные) методы.