Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВЫ ОФИСНОГО ПРОГРАММИРОВАНИЯ И ЯЗЫК VBA - 1....doc
Скачиваний:
59
Добавлен:
17.12.2018
Размер:
1.88 Mб
Скачать

Два конструктора класса Rational

Вернемся теперь к нашему классу и определим для него конструктор по умолчанию и "настоящий" свой конструктор:

'Конструкторы класса Rational

Private Sub Class_Initialize()

'Конструктор по умолчанию

'инициализирует рациональное число дробью 1/1

m = 1

n = 1

End Sub

Public Sub CreateRational(ByVal a As Integer, ByVal b As Integer)

'Собственный конструктор

'Выполняет довольно сложные действия,

'прежде чем свойства получат значения

Dim d As Integer 'Наибольший общий делитель a и b

If b = 0 Then

MsgBox " Ошибка при создании рационального числа!" _

& Chr(13) & "Знаменатель не должен равняться 0."

Else

' приведение знака

If b < 0 Then

b = -b: a = -a

End If

' приведение к несократимой дроби

d = nod(a, b) ' d - НОД(a,b)

m = a \ d

n = b \ d

End If

End Sub

' Скрытая функция вычисления НОД(m,n)

Private Function nod(ByVal m As Integer, ByVal n As Integer) As Integer

Dim p As Integer

m = Abs(m): n = Abs(n)

If n > m Then

p = m: m = n: n = p

End If

Do

p = m Mod n: m = n: n = p

Loop Until n = 0

nod = m

End Function

Пример 4.2. (html, txt)

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

Процедуры - свойства

Для того чтобы можно было получить доступ к закрытым свойствам, предусмотрены специальные процедуры - свойства:

  • Property Let позволяет установить новое значение терминального свойства, выполняя операцию Write (присваивание).

  • Property Set выполняет те же действия, что и предыдущая процедура, но применима к свойствам - участникам. Вы понимаете, что в VBA присваивание значений обычным переменным и объектам выполняется двумя различными операторами - Let и Set.

  • Property Get является дополнительной к предыдущим процедурам, выполняя операцию чтения Read. Она применима к терминальным свойствам и свойствам - участникам.

Рассмотрим пять ранее описанных стратегий применения свойств. В первой стратегии Read - Write каждому закрытому свойству будет соответствовать пара взаимно дополняющих процедур - свойств Let (Set) - Get. Эту стратегию мы реализовали для свойств класса "Личность". Стратегия Write-once предполагает, что значение свойства должно быть записано только при первом обращении, а далее не должно изменяться. Для реализации этой стратегии процедуры - свойства Let и Set должны включать в себя код, осуществляющий специальную проверку, проводилось ли ранее присвоение значения свойству. Для объектов это проверка типа "value Is Nothing", для переменных типа Variant - "value = Empty" и так далее. Мы не станем приводить подробный пример, подобную проверку мы осуществляли при работе со свойством Отчество в процедуре WhoIs класса " Личность. В следующих двух стратегиях используется только одна из процедур пары, либо Get, либо Let(Set). Пятая стратегия предполагает, что доступ к свойствам закрыт, и процедуры - свойства Get, Let(Set) в классе вообще не объявляются.

Обратим внимание на одну важную особенность, когда свойство имеет тип Variant, его значениями могут быть как обычные данные (числа, строки), так и объекты. В этой ситуации необходимо реализовать все три процедуры, применяя Let или Set в зависимости от того, с чем мы имеем дело - объектом или переменной.