Создание пользовательских классов в AccessИсточник: AccesSoft Admin
Общие определенияСначала определимся: что же такое объект в понимании объектно-ориентированного программирования. В самом простом (житейском) понимании объект - это какая-то вещь, и так же как и в окружающем мире, объект имеет свойства ("камень твердый") и операции, которые выполняются над этими свойствами (камень можно разбить). Почти так же обстоит дело и с объектами в мире программ. Например, в качестве объекта можно рассматривать файл, в качестве свойства - его размер или имя, а в качестве операций - чтение или запись. Итак, есть объект и есть свойства - что же является операцией? Любая пользовательская процедура или функция, изменяющая или просто работающая со свойствами объекта. Например, процедура инициализации полей записи или процедура вывода на экран значения полей. Возникает естественное желание объединить данные и способы их обработки в одно целое, так чтобы было ясно, какие процедуры предназначены для обработки определенных данных. Таким образом, мы вплотную подошли к центральным понятиям объектно-ориентированного программирования - понятиям инкапсуляции и класса. Инкапсуляция и классыОбъектно-ориентированное программирование (далее ООП) - наиболее популярная в настоящее время методология программирования, являющаяся развитием структурного программирования. Центральной идеей ООП является инкапсуляция, т. е. структурирование программы на модули особого вида, объединяющие данные и процедуры их обработки, причем внутренние данные модуля могут быть обработаны только предусмотренными для этого процедурами. В VBA принято название модуль класса или просто класс. Каждый класс имеет внутреннюю часть, называемую реализацией, и внешнюю часть, называемую интерфейсом. ВстраиваниеПомимо инкапсуляции, ООП на VBA характеризуется еще одним немаловажным свойством - встраиванием. Встраивание - это механизм порождения новых классов с использованием существующих. Пусть построен класс А, тогда при объявлении нового класса В его свойствами могут быть объекты класса А. В этом случае говорят, что класс А встроен в класс В, и класс А является родителем, а класс В - потомком. Встраивание - транзитивное отношение, т. е. можно создать произвольно длинную цепочку вложенных объектов, образующих иерархию родителей и потомков. Так, в новый класс С можно встроить объект класса В, который является объектом класса А. Для приложений Office XP характерна ситуация, когда необходимо указать 6 - 8 уровней вложенности, чтобы добраться до нужного объекта. Например, чтобы скрыть панель инструментов Стандартная в документе Word, необходимо выполнить следующее присваивание: Word.Application.ActiveDocument.CommandBars(2).Visible = False Механизм встраивания очень удобен и естественнен. Прародитель семейства классов может задавать некоторые фундаментальные свойства и методы, а многочисленные потомки, имея родительские корни (свойства и методы), привносят собственные узкоспециальные свойства и методы. НаследованиеНаряду со встраиванием, есть еще один способ использовать существующие классы при создании новых, он называется наследованием. При наследовании указывается, что вновь создаваемый на основе класса А класс В содержит все (или некоторые) методы и свойства класса А, а также свои собственные методы и свойства. Различие между встраиванием и наследованием только синтаксическое. При встраивании, используемом в VBA для ссылки на метод или свойство встроенного класса, мы используем имя поля этого класса. При наследовании (характерном для С и C++) имя свойства или метода родительского класса можно использовать непосредственно. Создание классаСинтаксически классы в VBA оформляются в виде специальных модулей классов (имя класса - это имя модуля), где в разделе Declarations помещается описание свойств (переменных) класса, а дальше идет описание методов (процедур) класса. Синтаксически описания свойств и методов практически не отличаются от описания обыкновенных переменных и процедур. Случаи отличия или особенностей употребления будут оговорены отдельно. Для создания модуля класса в Access необходимо в окне базы данных выполнить следующие действия: Insert - Class Module - "Имя класса" Следует выбрать для класса такое имя, которое легко будет распознаваться, и отражать информацию о том, какие объекты описывает данный класс объектов. Процедуры классаВ Access все процедуры класса делятся на три группы:
Синтаксис объявления таких процедур не отличается от стандартного, за исключением использования ключевого слова Friend. Ключевое слово Friend, как и ключевые слова Private и Public, предназначено для ограничения области видимости метода. Если Private делает метод видимым только внутри модуля, a Public - для всех модулей всех проектов, то Friend занимает промежуточную позицию между ними: он делает видимым метод только в том проекте, где был описан класс.
Как известно, определение класса в VBA состоит из двух разделов:реализации и интерфейса. Одна из наиболее трудных задач для программистов - новичков в ООП заключается в определении того, какие члены класса делать закрытыми (включать в раздел реализации), а какие, наоборот, открытыми (включать в раздел интерфейса). Общим правилом можно считать то, что чем меньше программе известно о реализации класса, тем лучше, т. е. желательно скрыть посредством ключевого слова Private как можно большее количество свойств класса в раздел реализации, а доступ к свойствам осуществлять через специальные Public - методы, организующие интерфейс класса.
Создание экземпляра классаОпределив класс, задав ему несколько свойств и методов, можно использовать его в программе VBA. Но для этого сначала необходимо создать новый экземпляр класса. Невозможно просто ссылаться на переменные или вызывать процедуры модуля класса таким образом, как это делается в стандартном модуле: VBA выдаст ошибку компиляции "Подпроцедура или функция не найдена", так как возможности найти процедуру в глобальном пространстве имен не существует. Процедура останется "скрытой" до тех пор, пока вы не создадите новый экземпляр класса, и тогда можно вызвать ее только как метод созданного экземпляра класса. Для создания нового экземпляра класса нужно объявить объектную переменную, которая используется для хранения ссылки на созданный экземпляр класса. Для переменных, применяемых для ссылки на пользовательские классы, действуют те же правила, что и для переменных, ссылающихся на объекты VBA или приложения. Их можно описать, используя зарезервированные слова Dim, Private, Public и Global. Следующим шагом является создание нового экземпляра объекта и сохранения ссылки на него в переменной. Для этого используется оператор Set в сочетание с ключевым словом New. Создание экземпляра класса. Имя класса User, имя экземпляра класса tmpuser. Dim tmpuser As User Заметьте, что типом данных в этом примере является имя класса, которое было определено раньше. Хотя такой синтаксис может показаться избыточным, для создания нового экземпляра объекта обязательно нужно использовать ключевое слово New в операторе Set. Если этого не сделать, то при попытке применить любое свойство или метод этого класса, VBA выдаст сообщение об ошибке выполнения 91 - "Не задана объектная переменная или переменная блока with". Для создания нового экземпляра объекта простого описания объектной переменной при помощи оператора Dim недостаточно. Неявное создание экземпляра классаОбъявление переменной и создание нового экземпляра класса можно объединить в одном операторе. Вот как это будет выглядеть: Dim tmpuser As New User После такого объявления переменную можно сразу использовать, обращаясь к свойствам и методам объекта, на который она указывает. При этом сам объект создается не оператором Dim, а позднее, при первом обращении к переменной. Хотя описанный способ неявного создания объектов и удобен, поскольку позволяет сэкономить одну строку кода, он имеет один недостаток: из-за того что в сложном приложении вы не знаете точно, когда будет создан объект, отладка такого приложения может быть затруднена. Поэтому рекомендуется всегда создавать объект явно, с помощью отдельного оператора Set New. |