Пользователи будут создавать объекты класса Query_base
и работать с ними только косвенно, через функции объектов класса Query
. Для класса Query
, наряду с получающим строку конструктором, определим три перегруженных оператора. Каждая из этих функций будет динамически резервировать новый объект типа, производного от класса Query_base
:
• Оператор &
создает объект класса Query
, связанный с новым объектом класса AndQuery
.
• Оператор |
создает объект класса Query
, связанный с новым объектом класса OrQuery
.
• Оператор ~
создает объект класса Query
, связанный с новым объектом класса NotQuery
.
• Конструктор класса Query
, получающий строку и создающий новый объект класса WordQuery
.
Следует понять, что работа этого приложения состоит в основном из построения объектов для представления запросов пользователя. Например, приведенное выше выражение создает коллекцию взаимодействовавших объектов, представленных на рис. 15.3.
Рис. 15.3. Объекты, созданные выражениями запросов
Как только создано дерево объектов, обработка (или отображение) данного запроса сводится к простому процессу (осуществляемому компилятором), который, следуя по линиям, опрашивает каждый объект дерева, чтобы выполнить (или отобразить) необходимые действия. Например, если происходит вызов функции eval()
объекта q
(т.е. корневого класса дерева), функция eval()
опросит объект класса OrQuery
, на который он указывает. Обработка этого объекта класса OrQuery
приведет к вызову функции eval()
для двух его операндов, что, в свою очередь, приведет к вызову функции eval()
для объектов классов AndQuery
и WordQuery
, которые осуществляют поиск слова wind
. Обработка объекта класса AndQuery
, в свою очередь, приведет к обработке двух его объектов класса WordQuery
, создав результаты для слов fiery
и bird
соответственно.
Новичкам в объектно-ориентированном программировании зачастую трудней всего разобраться в проекте программы. Но как только проект станет абсолютно понятен, его реализация не вызывает проблем. Чтобы проще было понять суть проекта, все используемые в этом примере классы были обобщены в табл. 15.1.
Таблица 15.1. Обзор проекта программы