Снова о конструкторах
Если в вашем классе не определен конструктор, VB.NET автоматически генерирует для него конструктор, вызываемый без аргументов. Работа этого конструктора сводится к инициализации всех полей экземпляра значениями по умолчанию. Такой конструктор называется конструктором по умолчанию или безаргументным конструктором. Если в классе определен хотя бы один пользовательский конструктор, VB.NET не станет генерировать конструктор по умолчанию.
Ничто не мешает вам определить в классе несколько конструкторов с разными уровнями доступа. Например, можно определить абсолютно безопасный конструктор с атрибутом Public и конструктор с атрибутом Friend, использование которого сопряжено с чуть большим риском. Конечно, эти конструкторы должны вызываться с разными параметрами, поскольку VB.NET различает методы по списку параметров, а не по модификаторам уровня доступа.
Конструкторы перегружаются, как и остальные методы, однако при этом нельзя использовать ключевое слово Overloads. Ниже приведен фрагмент обновленной версии класса Employee с конструктором, позволяющим задать значение нового поля.
Public Class Employee Private m_Name As String Private m_NickName As String Private m_Salary As Decimal Public Sub NewCByVal sName As String.ByVal curSalary As Decimal) m_Name = sName m_Salary = curSalary End Sub Public SubNewCByVal theName As String.ByVal nickName As String._ ByVal curSalary As Decimal) m_Name = theName m_NickName = nickName m_Salary = curSalary End Sub
Компилятор выбирает вторую версию конструктора лишь в том случае, если при вызове передаются два строковых параметра и один числовой. При передаче одной строки и числа выбирается первый конструктор.
Перегрузка конструкторов приводит к дублированию кода в программе. Так, в приведенном выше фрагменте значения m_Name и fli_Salary присваивались в обоих конструкторах. В VB.NET для таких ситуаций предусмотрена специальная сокращенная запись: конструкция MyClass.New вызывает другой конструктор класса [На момент написания книги также можно было воспользоваться ключевым словом Me, но вариант с MyClass является предпочтительным.]. Пример:
Public Sub New(ByVal sName As String.ByVal curSalary As Decimal) m_Name = Sname mJSalary = curSalary End Sub Public Sub New(ByVal sName As String, ByVal nickName As String._ ByVal curSalary As Decimal) MyClass.Newt sName.curSalary) m_NickName =nickName End Sub
При вызове другого конструктора конструкцией MyClass.New порядок определения конструкторов в программе не важен. VB.NET выбирает конструктор по типу переданных параметров независимо от его места в определении класса.
Примечание
Помните, что MyClass – ключевое слово, а не объект. Значение MyCLass нельзя присвоить переменной, передать процедуре или использовать в операторе Is. В подобных ситуациях используется ключевое слово Me; оно обозначает конкретный объект, код которого выполняется в настоящий момент.