progs.biz  
Начало>VB.NET>Основы>Урок 4
C#
VB.NET
Visual C++.NET
ASP.NET
Visual C++ 6
WinAPI
C/C++
Delphi
C++ Builder
Java
SQL
PHP
DirectX
Visual Basic 6.0
Ассемблер
Интернет
Сист. прогр-ние
Pocket PC
Обзор книг
Обзор программ

Б. Ивьен и др. Visual Basic .NET. Библия пользователя
Б. Ивьен и др. Visual Basic .NET. Библия пользователя
Заказать на Озоне



Яндекс-цитирования

Основы 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
    ...

Отличие теперь в том, что если мы попытаемся записать отрицательный возраст, то такое значение не запишется, а вместо него запишется ноль. Конечно, было бы правильнее в этом случае спрашивать возраст у пользователя, но сейчас этим заниматься не будем. Сейчас важно понять, что к внутренней переменной для возраста нет доступа напрямую, а только через свойство. В свойстве же предусмотрены методы для чтения и записи, которые позволяют, в частности, отфильтровывать неправильные значения.

Рассылки нашего сайта на Subscribe.Ru
Visual C++, MFC
C# и .NET
VB.NET
ASP.NET new!
Win API
C/C++
Delphi
Java
HTML, PHP, mySQL, WEB-дизайн
Flash MX
C++ Builder
Ассемблер
SQL Server
DirectX
Обзор книг
Обзор программ
Новости сайта progs.biz


 
 
Копирование любых материалов сайта без разрешения авторов и владельцев сайта запрещено.
© 2002-2008 сайт progs.biz
© 2002-2008 Игорь Алексеев