Основы офисного программирования и язык VBA

       

Методы


Не будем повторяться. О методах было сказано уже достаточно. Любая процедура (Sub) или функция (Function), описанная в разделе методов класса, является его методом. Напомним синтаксис методов класса:

[Private | Public | Friend] [Static] Sub name [(arglist)] [statements] [Exit Sub] [statements] End Sub [Public | Private | Friend] [Static] Function name [(arglist)] [As type] [statements] [name = expression] [Exit Function] [statements] [name = expression] End Function

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

  • Один или несколько конструкторов класса, в том числе конструктор по умолчанию, заданный обработчиком события Initialize.
  • Обычно, по паре процедур - свойств, определенных для каждого свойства класса.
  • Метод, задающий печать свойств класса.
  • Метод, позволяющий в диалоге с пользователем определять значения свойств класса, - своеобразный конструктор.
  • Остальные методы, определяющие специфику класса.

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

Пример 4.5.

(html, txt)

Замечание:

Внутри класса при реализации операций над рациональными числами доступ к закрытым свойствам объекта, естественно, разрешен, и можно обращаться непосредственно к переменным m и n. Однако нельзя обратиться к закрытым свойствам параметров класса Rational, передаваемых методам Plus, Minus, Mult, Divide. Точно также, нельзя обратиться к свойствам локальных объектов (объекту R), объявленных внутри методов. Единственный выход состоит в том, чтобы использовать для них Public Property Let и Public Property Get.
Но тогда и вне класса можно использовать эти процедуры - свойства, изменяя, например, значение знаменателя дроби. Разрешать этого не хотелось бы.

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

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

Public Sub WorkWithRational() Dim a As New Rational, b As New Rational, c As New Rational

a.CreateRational 5, 7 b.CreateRational -12, -18 Set c = a.Plus(b) c.PrintRational Set a = c.Minus(b) a.PrintRational Set c = a.Mult(b) c.PrintRational Set b = c.Divide(a) b.PrintRational End Sub

При ее запуске получены следующие результаты:

29/21 5/7 10/21 2/3


Содержание раздела