5. Члены классов
Членами классов являются поля, свойства, методы и события, объявленные в области видимости класса. Использование различных членов класса рассмотрим на следующем примере:
Module MyModule
Public Class Human
Private humanName As String ‘Поле Имя
Private humanAge As Integer ‘Поле возраст
‘Объявление событий, уведомляющих о смене имени и возраста
Public Event NameChanged(ByVal NewNameValue as String)
Public Event AgeChanged(ByVal NewAgeValue as Integer)
Public Property Name() As String ‘Свойство имя
Get
Return humanName
End Get
Set (ByVal Value As String)
humanName=Value
RaiseEvent NameChanged(humanName) ‘Рассылка события смены имени
End Set
End Property
Public Property Age () As Integer ‘свойство возраст
Get
Return humanAge
End Get
Set (ByVal Value Is Integer)
If Value <0 Or value >200 Then
‘Вывод сообщения об ошибке изменения возраста
Console.Writeline(“Возраст должен быть между 0 и 200 годами”)
Else
If humanAge <> Value Then
humanAge = Value
RaiseEvent AgeChanged(humanAge) ‘Рассылка события смены возраста
End If
End Set
End Property
Public Sub OutpunName()
Console.Writeline(humanName)
End Sub
End Class
Sub SomeNameChanged(ByVal name As String) ‘обработка события смены имени
Console.Writeline(“Имя изменено на ” & name)
End Sub
Sub SomeAgeChanged(ByVal Age AsInteger) ‘обработка события смены возраста
Console.Writeline(“Возраст изменен на ” & age)
End Sub
Sub Main () ‘точка входа в программу
Dim h As New Human ()
‘Регистрируем обработчики двух событий
AddHandler h.NameChanged, Adressof SomeNameChanged
AddHandler h.NameChanged, Adressof SomeAgeChanged
h.Name = “Иванов А.П.”
h.OutputName() ‘вывод имени
h.Age = 25 ‘вызывает обработку события изменения возраста
Console.Writeline(h.Age) ‘вывод возраста
h.Age = 25 ‘не вызывает обработку события, т.к. возраст не изменился
h.Age = -20
Console.Writeline(h.Age) ‘вывод возраста. Результат тот же
Console.Readline() ‘ ожидание нажатия клавиши <Enter>
End Sub
End Module
В ходе работы этой программы на экран будет выведено:
Имя изменено на Иванов А.П.
Иванов А.П.
Возраст изменен на 25
25
Возраст должен быть между 0 и 200 годами
25
Поля представляют собой обычные переменные, принадлежащие классу или экземпляру класса. При создании экземпляра класса все его поля автоматически инициализируются 0, однако возможна и инициализация поля в момент его объявления, в этом случае компилятор гарантирует, что поле будет проинициализировано до первого обращения к нему.
Методы представляют собой процедуры и функции, объявленные внутри класса. Как и поля, методы могут быть вызваны для конкретного экземпляра или же для класса. Как уже говорилось ранее, VB.Net позволяет передавать параметры по ссылке или по значению, при этом следует иметь в виду, что передача объектов фактически означает передачу ссылки на них, поэтому вызываемая функция будет иметь доступ непосредственно к объекту. VB.Net позволяет объявлять и параметры методов по умолчанию.
Свойства позволяют выполнять вызов функции синтаксически похожей на присваивание значения переменной или же на чтение значения переменной. В приведенном примере создается класс, содержащий данные о человеке, в частности, класс содержит данные об имени и возрасте человека. Эти данные спрятаны от непосредственного доступа (они объявлены с модификатором Private). Доступ к ним открывается с помощью метода OutputName() и соответствующих свойств: Name(), Age(). Причем, свойство Age позволяет не просто установить или считать возраст человека, но и провести проверку на допустимость введенного значения. Такую проверку было бы невозможно провести, ели бы возраст был просто открытой переменной.
Обычно свойства позволяют выполнять чтение и запись переменных (полей), однако можно сделать так, чтобы свойство было доступно только для чтения или только для записи. Для этого остаточно опустить один из блоков Get или Set, указав при этом слова ReadOnly (если есть только блок Get) или WriteOnly (если есть только блок Set). Например,
Public Readonly property MaxAge() Is Integer
Get
Return 200
End Get
End Property
Допустимо указание различного уровня доступа для блоков Get, Set, однако при этом уровень доступа этих методов должен быть ниже уровня доступа свойства. Иными словами, можно сделать свойство открытым, а блок Set закрытым, но не наоборот.