Основы VB.NET Урок 4. Поля и свойства классов в VB.NET
Внутри экземпляра класса могут содержаться данные. Например, если есть класс "Квадратное уравнение", то экземпляр такого класса содержит в себе коэффициенты конкретного уравнения, если есть класс "Работник", то экземпляр такого класса может содержать в себу такие данные как возраст, стаж и т. п. Заметься сразу, что данные класса, в отличие от методов класса, принадлежат отдельному экземпляру класса. Т. е., например, у одного работника возраст один, а у другого, естественно, другой (вообще-то говоря, данные тоже могут быть разделяемыми, но это мы сейчас обсуждать не будем, а рассмотрим в одном из последующих уроков).
Данные класса могут быть реализованы или как поля, или как свойства. Вот пример класса, где данные реализованы как поля:
Imports System
Class Worker
'Задаем два поля в классе
Public age As Integer
Public name As String
End Class
Class Test
Public Shared Sub Main()
Dim wrk1 As New Worker()
wrk1.age = 23
wrk1.name = "Вася"
Console.WriteLine("Имя: {0}, возраст: {1}", wrk1.name, wrk1.age)
End Sub
End Class
Обратите внимание, что оба поля в классе Worker - age и name, мы задали как Public. Именно поэтому мы можем напрямую обращаться к ним извне класса:
...
cl.age = 23
cl.name = "Вася"
...
В тестовом классе Test мы создаем экземпляр wrk1 класса Worker и затем присваиваем его полям некоторые значения. В строке
...
Console.WriteLine("Имя: {0}, возраст: {1}", wrk1.name, wrk1.age)
...
мы выводим значения на экран. Синтаксис здесь такой - в кавычках мы пишем все, что мы хотим вывести, при этом места для вывода переменных мы резервируем как {0}, {1} и т. д. (резервируем столько мест, сколько переменных), сами же переменные пишем в качестве последующих параметров WriteLine через запятую.
Результат выполнения программы будет таким:
Но такой способ (через поля) задания даннных в классе не слишком хорош. Вот пример другого ("неправильного") использования нашего класса Worker в классе Test:
...
Class Test
Public Shared Sub Main()
Dim wrk1 As New Worker()
wrk1.age = -23
...
End Sub
End Class
Как вы видите, ничто не мешает записать в качестве возраста Васи отрицательное число. И ничего, никакой ошибки не возникает. Именно для того, чтобы таких казусов не возникало, и рекомендуется использовать для данных класса не поля, а свойства. Вот как это делается:
Class Worker
'Задание свойсва
Property age() As Integer
'Чтение свойства
Get
Return ageValue
End Get
'Запись свойства
Set(ByVal Value As Integer)
If Value <= 0 Then
ageValue = 0
Else
ageValue = Value
End If
End Set
End Property
Private ageValue As Integer
Public name As String
End Class
Что мы тут измемнили? Во-первых, мы вместо Public-переменной age задали Private-переменную ageValue:
...
Private ageValue As Integer
...
Ключевое слово private означает, что прямого доступа извне класса к этой переменной нет. Далее мы завели в нашем классе свойство age целого типа:
...
Property age() As Integer
...
End Property
...
Внутри этого свойства мы задаем правила его чтения и записи:
...
'Чтение свойства
Get
...
End Get
'Запись свойства
Set(ByVal Value As Integer)
...
End Set
...
При этом когда мы читаем наше свойство age, то мы фактически читаем значение переменной ageValue:
...
Get
Return ageValue
End Get
...
Записываем мы нечто в свойство age только тогда, когда это нечто положительное, если же оно отрицательное или ноль, то записываем ноль:
...
Set(ByVal Value As Integer)
If Value <= 0 Then
ageValue = 0
Else
ageValue = Value
End If
End Set
...
Используем мы наш новый вариант класса также, как и старый:
...
Dim cl As New Worker()
cl.age = 23
...
Отличие теперь в том, что если мы попытаемся записать отрицательный возраст, то такое значение не запишется, а вместо него запишется ноль. Конечно, было бы правильнее в этом случае спрашивать возраст у пользователя, но сейчас этим заниматься не будем. Сейчас важно понять, что к внутренней переменной для возраста нет доступа напрямую, а только через свойство. В свойстве же предусмотрены методы для чтения и записи, которые позволяют, в частности, отфильтровывать неправильные значения.
|