Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Korporativnye_informatsionnye_sistemy.docx
Скачиваний:
12
Добавлен:
01.03.2025
Размер:
260 Кб
Скачать
☆

Моделирование наследования. Фактическое наследование. WithEvents.

Моделирование заключается во включении в свойства класса объектной переменной другого класса.

Покажем разницу в распределении ОП в случае наследования и в случае моделирования. Пусть есть описания классов для заводской поликлиники:

Класс человек = имя, фамилия, отчество, дата рождения.

Класс работник = дата поступления, специальность, место работы.

Класс больной = диагноз, дата начала болезни, лечение.

Слева в таблице показаны фрагменты программы в предположении, что наследование есть, справа – наследования нет.

Описание связей классов

Работник ЭТО человек

Больной ЭТО работник

Класс работник = дата поступления, специальность, место работы, к_человек

Класс больной = диагноз, дата начала болезни, лечение, к_работник

Описание объектных переменных, создание экземпляра производного класса.

Описание Б New типа больной

Dim Б as New больной

Б.к_работник = New работник

Б.к_работник.к_человек = New человек

Обращение к элементам классов

Б.специальность

Б.имя

Б. к_работник .специальность

Б. к_работник.к_человек.имя

Наличие фактического наследования в VBA можно показать на примере элементов управления на форме. Все элементы коллекции Controls имеют координаты, размеры, и т.п. Поэтому если Вы опишите объектную переменную типа Control, то редактор будет подсказывать Вам эти свойства. Если же Вы опишите переменную типа Image, то увидите подсказку особых свойств элемента управления, например, Picture. В то же время к этому элементу можно обратиться двумя способами, видя при каждом разный набор свойств.

Поместите на форму один элемент управления Image. Программа, вызываемая, например, по щелчку на форму, изменяет высоту и цвет фона последнего добавленного элемента, то есть Image.

Dim s As Control, si As Image

Set s = Controls(Controls.Count - 1)

s.Height = s.Height + 10

Set si = s

' а можно и Set si=Controls(Controls.Count - 1)

si.BackColor = RGB(Rnd * 255, Rnd * 255, Rnd * 255)

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

Dim s As Control

Set s = Controls(Controls.Count - 1)

s.Height = s.Height + 10

s.BackColor = RGB(Rnd * 255, Rnd * 255, Rnd * 255)

s.Picture = LoadPicture(ActiveDocument.Path & "\S.jpg")

Если же последний элемент управления не является Image, то оба варианта кода приведут к ошибке. В первом случае сообщение об ошибке будет выдано при выполнении оператора присваивания Set si=s – несоответствие типов. А во втором случае при попытке обратиться к свойству BackColor будет сказано, что такого свойства нет (если его действительно нет у последнего элемента управления).

Пользовательские события.

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

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

Объектная переменная такого типа (пользовательский класс с событиями) должна описываться со словом WithEvents. Обработчики событий должен писать пользователь Вашего класса.

Пусть описан класс с именем «calc» следующим образом.

Public Event vrong (i As Integer)

Public Function fact(i as integer) as Integer

Dim r as integer, j as Integer

r=1

For j=2 to i

r= r*j

If r>256 Then

RaiseEvent vrong (j)

fact = r

Exit Sub

Endif

Next

fact=r

End Function

Тогда в обычном модуле: описана объектная переменная, создан экземпляр, вызван метод, описан обработчик события.

Dim WithEvents cl as calc

Sub try()

Set cl = New calc

MsgBox cl.fact(5)

MsgBox cl.fact (555)

End Sub

Sub cl_vrong(c as Integer)

MsgBox “Слишком большое число, посчитано только для ” & c

End Sub

При выполнении процедуры try сначала будет выдан результат 120, затем будет выдано сообщение о слишком большом числе и затем – частично посчитанный результат.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]