Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Свойства и события в VB. Связь объекта класса и его клиентов




Как уже упоминалось, создание поля в классе объектов возможно с помощью объявления переменной уровня модуля класса. Однако такие поля класса имеют один недостаток – класс не имеет возможности узнать об изменениях значения этого поля. Данная проблема решается при помощи специального механизма объектно-ориентированного программирования – свойств класса (class property). Для поддержки этого механизма в VB служит специальное ключевое слово PROPERTY. Свойства это особого вида подпрограммы, объявление которых возможно только в рамках модуля класса с помощью указанного ключевого слова. Эти подпрограммы автоматически выполняются классом тогда, когда значение свойства устанавливается или считываются, внешним по отношению к классу кодом, то есть клиентом класса.

В операторном блоке такой подпрограммы, объявленной с помощью оператора PROPERTY можно выполнять операции, касающиеся данного свойства, тем самым, обеспечивая реакцию класса на доступ к данным конкретного объекта класса.

Существует три разновидности подпрограмм-свойств: PROPERTY GET, PROPERTY LET и PROPERTY SET. Первая возвращает значения свойства экземпляра класса, а два последних, наоборот, задают (устанавливают) эти значения. Отличия между PROPERTY LET и PROPERTY SET заключаются в том, что PROPERTY LET используется для скалярных значений, а PROPERTY SET – для объектных типов.

Рассмотрим на примере использование объектного механизма свойств в VB. В методе доступа, который отвечает за присваивание значения (PROPERTY LET), реализуем действия, которые позволят ограничить количество символов устанавливаемого и выводимого сообщения. Модифицируем ранее рассмотренный модуль класса CMessage следующим образом:

 

'Модуль класса CMessge

' Объявим поле в виде закрытой переменной mMsg

Private mMsg As String                  

'Подпрограмма Message типа Property Get

'возвращает значения поля mMsg из класса

Public Property Get Message() As String

Message = mMsg

End Property

'Подпрограмма Message типа Property Let

' устанавливает значение поля mMsg

Public Property Let Message (ByVal NewValue As String)

'если длина сообщения меньше 128 символов 

If Len( NewValue ) < 128 Then

           'устанавливаем новое значение свойству

   mMsg = NewValue

Else

       mMsg = ""

End If     

End Property

'Метод класса

Public Sub ShowMessage ()

MsgBox mMsg

End Sub

 

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

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

Покажем, каким образом можно использовать свойство Message нового класса CMessage:

 

Dim objNewMsg As CMessage

Set objNewMsg = New CMessage

' используем свойство, так как если бы это было простое поле

objNewMsg.Message = "Привет удивительный мир ООП"

objNewMsg.Show

 

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

Наряду со свойствами и методами, которые раскрывают класс для его потребителя, на уровне синтаксиса языка VB для класса определены так называемые пользовательские события (user-defined events). Пользовательские события представляют еще один способ взаимодействия потребителя с экземпляром класса. Пользовательское событие определяет в общем случае реакцию потребителя класса на действие со стороны его экземпляра, тогда как механизм свойств и методов обеспечивает организацию реакции класса на действия со стороны потребителя.

Специальная подпрограмма – обработчик события представляют собой представляет собой процедуру на стороне клиента класса, которая выполняется в ответ на сгенерированное объектом класса алгоритмическое действие в виде исполнения специального оператора.

На стороне класса для работы с событием необходимо определить (декларировать) событие и генерировать его в одном из методов класса.

События объявляться на уровне модуля класса в разделе описаний, подобно тому, как объявляются переменные, но помощью ключевого слова EVENT. В отличие от объявления переменных в объявлении события указывается не только имя события, но его параметры как в подпрограмме, если таковые имеются. Например, в классе CMessage определим событие возникающие до, и после отображения текста сообщения:

 

           Event AfterShow()

Event BeforeShow(Cancel AsBoolean)

 

Событие должно быть возбуждаться (raise) или по-другому говоря генерироваться в исполняемой части класса, то есть в одном из его методов. Генерация события выполняется с помощью ключевого слова RAISEEVENT. Причем, однажды описанное событие может сколь угодно много раз генерироваться. Например:

 

Public Sub ShowMessage()

Dim fCancel As Boolean

' Возбуждение события BeforeShow

RaiseEvent BeforeShow (fCancel)

If fCancel Then Exit Sub

MsgBox mMsg

' Возбуждение события AfterShow

RaiseEvent AfterShow

End Sub

 

Применение ключевого слова RAISEEVENT для генерации события сходно с применением ключевого слова CALL для выполнения процедур, поскольку при этом действительно происходит вызов подпрограммы, только подпрограмме, которая находится на стороне клиента класса. Как и в случае процедур, аргументы не объявленные с ключевым словом BYVAL, VB передает обработчику по ссылке. Это значит, что обработчик события может изменить значение такого аргумента и код класса увидит это изменение. Например, событие BeforeClose, передает переменную (не литеральное значение) для получения данных из обработчика событий, в котором может быть разрешено или запрещено отображение комментария.

Важной особенностью использования механизма событий в VB, является то, что для того чтобы события класса стали доступны для потребителя класса, необходимо в объявлении объектной переменной указать ключевое слово WITHEVENTS. Ключевое слово может использоваться с объектными переменными объявленными на уровне модуля и только в модуля класса. Это связано с том, что для обработки событий VB использует технологию COM (Component Object Model – компонентная модель объектов), и COM требует, чтобы инициатор события и обработчик событий были объектами.

 

Private WithEvents objMsg As CMessage

 

На события объявленного таким образом объекта можно реагировать с помощью стандартного механизма VB – процедур обработки событий. Редактор VB позволяет автоматически формировать скелет процедур обработки.

 

Private SubobjMsg_BeforeShow(Cancel AsBoolean)

Cancel = True

End Sub

 

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 370.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...