Добавление свойств в класс

Обновлен: Ноябрь 2007

На этом занятии вы узнаете способы добавления свойств в класс, созданный на предыдущем занятии.

На предыдущем занятии Подробное рассмотрение. Понятие о свойствах, методах и событиях было показано, что все объекты могут иметь атрибуты и свойства, представляющие их. на предыдущем занятии класс Persons представляет человека. Каждый человек имеет такие атрибуты, как имя и возраст, поэтому класс Persons требует свойств для представления этих атрибутов.

Свойства можно добавить к классу двумя способами: как поле или как процедуру свойства. Можно также определить действие свойства с помощью модификаторов свойств Public, ReadOnly или WriteOnly.

Поля и процедуры свойств

Поля в действительности являются открытыми переменными внутри класса, которые могут быть заданы или прочитаны вне класса. Они полезны для свойств, которые не нужно проверять, например для значений типа Boolean (True или False). В случае класса Persons можно использовать свойство типа Boolean с именем Married, показывающее состоит ли человек в браке или нет. Поскольку существует только два возможных значения, поле подходит для этого свойства.

Код для добавления поля к классу будет выглядеть следующим образом.

Public Married As Boolean

Однако большинство свойств более сложны, чем описанное. В большинстве случаев для добавления свойств к классу необходимо использовать процедуры свойств. Процедуры свойств состоят из трех компонентов: объявление закрытой переменной для хранения значения свойства, процедура Get, возвращающая значение, и процедура Set, устанавливающая значение.

Например, процедура для свойства Name класса Persons будет выглядеть следующим образом.

Private nameValue As String
Public Property Name() As String
    Get
        Name = nameValue
    End Get
    Set(ByVal value As String)
        nameValue = value
    End Set
End Property

В первой строке кода объявляется частная переменная типа String, nameValue, которая будет хранить значение свойства. Сама процедура свойства начинается с Public Property и заканчивается End Property.

Процедура Get содержит код, который будет выполняться при чтении значения. Например, если считывается свойство Persons.Name, код будет возвращать значение, хранимое в переменной nameValue.

Процедура Set содержит код, используемый для присваивания нового значения переменной nameValue с использованием значения, переданного в качестве аргумента value. Например, если написать код Persons.Name = "John", значение типа String (John) будет передаваться в качестве аргумента value. Затем код процедуры Set присваивает переданное значение переменной NameValue.

Может возникнуть вопрос, зачем использовать процедуру свойства для представления свойства Name вместо поля. В реальном мире существуют определенные правила для имен. Например, имена обычно не содержат числа. Можно добавить код к процедуре Set для проверки аргумента value и возврата ошибки, если аргумент содержит цифры.

В следующей процедуре к классу Persons добавляются поле и три свойства.

Практическое задание

Добавление свойств к классу

  1. Откройте проект Persons, созданный на предыдущем занятии. Если он не был сохранен, сначала необходимо вернуться к предыдущему разделу Моделирование объекта реального мира: создание первого класса и завершить описанные в нем действия.

  2. В обозревателе решений выберите проект Persons.vb, затем в меню Вид выберите Код.

  3. Добавьте следующий код объявления под строкой Public Class Persons.

    Private firstNameValue As String
    Private middleNameValue As String
    Private lastNameValue As String
    Public Married As Boolean
    
  4. Добавьте следующий код объявления процедур свойств.

    Public Property FirstName() As String
        Get
            FirstName = firstNameValue
        End Get
        Set(ByVal value As String)
            firstNameValue = value
        End Set
    End Property
    
    Public Property MiddleName() As String
        Get
            MiddleName = middleNameValue
        End Get
        Set(ByVal value As String)
            middleNameValue = value
        End Set
    End Property
    
    Public Property LastName() As String
        Get
            LastName = lastNameValue
        End Get
        Set(ByVal value As String)
            lastNameValue = value
        End Set
    End Property
    
  5. В меню Файл выберите команду Сохранить все, чтобы сохранить проект.

Свойства, доступные только для чтения и только для записи

Иногда свойство необходимо задать один раз и никогда не изменять во время выполнения программы. Например, свойство, представляющее номер сотрудника, не должно изменяться. Оно может быть считано другой программой, но его значение не должно быть изменено.

Ключевое слово ReadOnly используется для определения свойства, которое доступно только для чтения (но не для записи). При попытке присвоить значение свойству ReadOnly в редакторе кода произойдет ошибка.

Чтобы создать свойство только для чтения, следует создать процедуру свойства, включающую процедуру Get, но не включающую процедуру Set.

Private IDValue As Integer
ReadOnly Property ID() As Integer
    Get
        ID = IDValue
    End Get
End Property

Аналогично, ключевое слово WriteOnly позволяет задавать значение свойству, но не допускает его чтения. Например, не допускается считывание свойства пароля другими программами. Можно использовать это значение для выполнения действий внутри класса. При этом свойство будет закрытым.

Чтобы создать свойство только для записи, следует создать процедуру свойства, включающую процедуру Set, но не включающую процедуру Get.

Private passwordValue As String
WriteOnly Property Password() As String
    Set(ByVal value As String)
        passwordValue = value
    End Set
End Property

Процедуры свойств ReadOnly и WriteOnly также используются, если требуется получить одно значение свойства и преобразовать его в другое значение. Например, рассмотрим возраст человека. В отличие от имени, возраст изменяется со временем. Если возраст был назначен для класса и считан год спустя без изменений, он будет неправильным.

Чтобы предотвратить это, в классе Persons можно добавить два свойства: свойство WriteOnlyBirthYear, представляющее год рождения, который никогда не изменяется, и свойство ReadOnlyAge, которое возвращает значение (разность между текущим годом и годом рождения).

Практическое задание

Добавление к классу свойств только для чтения и только для записи

  1. Добавьте следующий код объявления ниже других объявлений в верхней части модуля класса.

    Private birthYearValue As Integer
    
  2. Добавьте следующий код объявления процедур свойств.

    WriteOnly Property BirthYear() As Integer
        Set(ByVal value As Integer)
            birthYearValue = value
        End Set
    End Property
    
    ReadOnly Property Age() As String
        Get
            Age = My.Computer.Clock.LocalTime.Year - birthYearValue
        End Get
    End Property
    
  3. В меню Файл выберите команду Сохранить все, чтобы сохранить проект.

Следующие действия

На этом занятии были рассмотрены свойства и различные способы их добавления к классу. На следующем занятии вы узнаете, как добавить к классу методы, позволяющие выполнять определенные действия.

Следующее занятие: Добавление методов в класс

См. также

Задачи

Моделирование объекта реального мира: создание первого класса

Основные понятия

Процедуры свойств и поля

Другие ресурсы

Программирование с применением объектов. Использование классов