Классы и объекты
Давайте рассмотрим работу с классами на примере класса Person.
Пример 20.1. Создание класса Person.
- Insert › Class Module
- Properties Name: = Person
Программа 20.21. Создание класса.
Public name As String Private birthday As Date Private male As BooleanPublic Sub perslnit(Optional persName As String = "Novikov", Optional persBirth As Date = #10/10/511, Optional persMale As Boolean = True) name = persName birthday = persBirth male = persMale End SubPublic Sub persPrint() Dim str As Stringstr = "Person name is " & name & Chr(13) & Ilf(male, "He", "She") & " was born in " & birthday MsgBox(str) End SubПеред тем как перейти к описанию синтаксиса объявления объектов класса, мы хотели бы обратить внимание на внутренний процесс их создания. Вообще, объект – это переменная, поэтому, когда он создается, для него выделяется необходимая память (ее размер зависит от типов свойств класса), а имя объекта ссылается на адрес памяти, где расположен объект. А теперь небольшой фокус, невозможный для переменных простых типов. В VBA есть возможность создания только ссылки на объект без фактического его присутствия. Подобная ссылка указывает адрес памяти, где будет храниться объект. Синтаксис объявления ссылок на объект не отличается от объявления простых переменных:
{Dim | Private | Public} имяОбъекта As ObjectЕсли вы обратитесь к таблице встроенных типов (табл. 20.4), то увидите, что для переменных данного типа отводится 4 байта, ровно столько, сколько необходимо для хранения адреса памяти. Конечно, ссылка сама по себе бессмысленна и ее, в конце концов, необходимо будет связать с реально существующим объектом посредством оператора присваивания set, но до этого нужно объявить объект. Синтаксис объявления объектов, класс которых определен пользователем, прост:
{Dim | Private | Public | Static} имяОбъекта As [New] имяКлассаСпецификатор New указывает компилятору, что создается новый объект и под него необходимо выделить память. Использование оператора set позволяет связывать ссылку с реальным объектом:
Set ИмяОбъекта = {[New] объектноеВыраженме | Nothing}Где имяОбъекта и объктноеВыражение – это ссылки на объект. Таким образом, ссылке слева присваивается значение ссылки справа. Спецификатор Nothing разрывает установленное значение ссылки. Связывание с использованием оператора New называется ранним, с использованием ссылок на объект – поздним.
Рассмотрим объявление объектов класса Person. Сначала создается объект author. Далее посредством метода класса persinit инициализируются свойства объекта: имя, дата рождения и пол. После чего объявляется ссылка на объект, а потом происходит присваивание ссылке he значения ссылки author и в качестве подтверждения того, что все связалось верно, производится вывод свойств объекта he посредством метода persPrint.
Программа 20.22. Объявление объектов класса, определенного пользователем.
— Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта.
— Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы).
— SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание.
SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Зарегистрироваться и Начать продвижение
Sub ObjectExample() Dim author As New Person Dim he As Objectauthor.perslnit "Novikov", #10.10.51* Set he = author he.persPrint End SubПосле объявления объектов, определенных пользователем, уместно рассказать об объявлении нового класса на основе уже созданного. Как мы говорили выше, для этого предусмотрен механизм встраивания объектов родительского класса в новый класс. Таким образом, объект класса родителя становится значением свойства класса потомка. Но объявление такого свойства синтаксически выглядит как объявление объекта класса. Продемонстрируем встраивание классов на примере создания нового класса Book. Для этого сначала проделаем стандартную процедуру создания нового модуля класса и присваивания ему имени Book. Потом встроим объект author класса Person и добавим свойство title и два метода booklnit и bookPrint.
Метод bookinit инициализирует объект класса Book, в качестве параметров этот метод получает строку для инициализации свойства title и ссылку на объект класса Person для инициализации свойства author.
Программа 20.23. Встраивание классов.
Dim author As New Person Private title As StringPublic Sub booklnit(str As String, persObject As Person) title = str Set author = persObject End SubPublic Sub bookPrint() Dim str As Stringstr = "Book title is " & title & Chr(13) & "Written by " & author.name MsgBox(str) End Sub