8.10. ПРИМЕР РЕТРОСПЕКТИВНОЙ РАЗРАБОТКИ ИЕРАРХИИ КЛАССОВ БИБЛИОТЕКИ ВИЗУАЛЬНЫХ КОМПОНЕНТ DELPHI И C++ BUILDER
8.10. ПРИМЕР РЕТРОСПЕКТИВНОЙ РАЗРАБОТКИ ИЕРАРХИИ КЛАССОВ БИБЛИОТЕКИ ВИЗУАЛЬНЫХ КОМПОНЕНТ DELPHI И C++ BUILDER
Delphi и C++ Builder представляет собой визуальное средство разработки корпоративных информационных систем. В C++ Builder используется язык объектно-ориентированного программирования C++, а в Delphi — Object Pascal. Несмотря на это, обе среды используют одни и те же модули библиотеки визуальных компонент, написанных на Object Pascal.
Каждый тип органов управления системы описывается классом, а помещаемые на формы конкретные органы управления являются объектами соответствующих классов. Так, например, Button1, Button2…, ButtonN являются объектами класса TButton; Edit1, Edit2…, EditM — объектами класса TEdit и т. п. Когда пользователь создает форму в визуальной интегрированной среде, он, по сути (в отличие от других органов управления), создает новый класс, объектом которого будет форма, появляющаяся при выполнении приложения (например, класс — TForm1, объект класса — Form1).
С целью уяснения процессов разработки иерархии классов предпримем попытку ретроспективного анализа иерархии классов системы Delphi/C++ Builder.
В процессе анализа была расписана иерархия классов, избранных для примера органов управления, выделены некоторые обязанности, которые мог бы наложить на них разработчик, а затем на основе сравнения списков выделенных обязанностей предпринята попытка обосновать иерархию классов, принятую в средах Delphi/C++ Builder.
Следует отметить, что данный анализ проводится с чисто учебными целями, поэтому здесь не рассмотрены все органы управления, а также все обязанности, которые может наложить разработчик на тот или иной орган управления.
Рассмотрим органы управления, которые могут быть получены транспортировкой их при помощи мыши с палитры компонент Delphi/C++ Builder.
— TButton — обыкновенная кнопка;
— TRadioButton — радиокнопка (группа кнопок с зависимой фиксацией, обеспечивающей возможность выбора лишь одной кнопки из группы);
— TListBox — обычный список;
— TDBListBox — список для работы с таблицами данных;
— TDataSource — источник данных (является посредником между элементами DataAccess: Table, Query, — и органами управления базами данных DataControls: DBGrid, DBEdit и т. п.).
Попытаемся в общих чертах прокомментировать данную иерархию и обосновать ее на основе метода распределения обязанностей. Ниже приведен набор обязанностей для перечисленных компонентов.
Обязанности объектов класса TDataSource:
— контролировать доступ пользователя к элементам TDataSet;
— обеспечивать возможность определения, подключен ли TDataSource к некоторому элементу TDataSet;
— обеспечивать возможность работы с дочерними компонентами;
— обеспечивать возможность копирования данных в другой объект того же класса;
— обеспечивать возможность уничтожения объекта с высвобождением памяти;
— обеспечивать возможность посылать сообщения;
— определять имя класса, объектом которого является данный элемент.
Обязанности объектов класса TButton:
— обрабатывать сообщения WMLBUTTONDOWN и WMLBUTTONDBLCLK (нажатие и двойное нажатие левой кнопки мыши);
— программно эмулировать нажатие кнопки;
— обрабатывать сообщения от клавиатуры;
— получать фокус ввода;
— определять, имеется ли фокус ввода;
— определять, может ли объект иметь фокус ввода (например, если элемент невидим, ему нельзя передать фокус ввода);
— обрабатывать сообщение BMCLICK (происходит после нажатия кнопки мыши);
— становиться видимым и невидимым;
— перерисовываться;
— обеспечивать возможность перевода точки из системы координат окна в систему координат экрана;
— хранить идентификатор родителя (с возможностью изменить родителя);
— обеспечивать возможность работы с дочерними компонентами;
— обеспечивать возможность копирования данных в другой объект того же класса;
— обеспечивать возможность уничтожения объекта с высвобождением памяти;
— обеспечивать возможность посылать сообщения;
— определять имя класса, объектом которого является данный элемент.
Обязанности объектов класса TRadioButton:
— обрабатывать сообщения WMLBUTTONDOWN и WMLBUTTONDBLCLK (нажатие и двойное нажатие левой кнопки мыши);
— определять, какая выбрана кнопка из группы кнопок;
— обрабатывать сообщения от клавиатуры;
— получать фокус ввода;
— определять, имеется ли фокус ввода;
— определять, может ли объект иметь фокус ввода (например, если элемент невидим, ему нельзя передать фокус ввода);
— обрабатывать сообщение BMCLICK. (происходит после нажатия кнопки мыши);
— становиться видимым и невидимым;
— перерисовываться;
— обеспечивать возможность перевода точки из системы координат окна в систему координат экрана;
— хранить идентификатор родителя (с возможностью изменить родителя);
— обеспечивать возможность работы с дочерними компонентами;
— обеспечивать возможность копирования данных в другой объект того же класса;
— обеспечивать возможность уничтожения объекта с высвобождением памяти;
— обеспечивать возможность посылать сообщения;
— определять имя класса, объектом которого является данный элемент.
Обязанности объектов класса TListBox:
— очищать список;
— обеспечивать возможность нахождения нескольких элементов из списка;
— определять номер элемента списка по координатам точки, принадлежащей объекту класса TListBox;
— обрабатывать сообщения от клавиатуры;
— получать фокус ввода;
— определять, имеется ли фокус ввода;
— определять, может ли объект иметь фокус ввода (например, если элемент невидим, ему нельзя передать фокус ввода);
— обрабатывать сообщение BM_CLICK (происходит после нажатия кнопки мыши);
— становиться видимым и невидимым;
— перерисовываться;
— обеспечивать возможность перевода точки из системы координат окна в систему координат экрана;
— хранить идентификатор родителя (с возможностью изменить родителя);
— обеспечивать возможность работы с дочерними компонентами;
— обеспечивать возможность копирования данных в другой объект того же класса;
— обеспечивать возможность уничтожения объекта с высвобождением памяти;
— обеспечивать возможность посылать сообщения;
— определять имя класса, объектом которого является данный элемент.
Обязанности объектов класса TDBListBox:
— обеспечивать связь с источником данных (TDataSource);
— очищать список;
— обеспечивать возможность вывода нескольких элементов из списка;
— определять номер элемента списка по координатам точки, принадлежащей объекту класса TDBListBox;
— обрабатывать сообщения от клавиатуры;
— получать фокус ввода;
— определять, имеется ли фокус ввода;
— определять, может ли объект иметь фокус ввода (например, если элемент невидим, ему нельзя передать фокус ввода);
— обрабатывать сообщение BMCLICK (происходит после нажатия кнопки мыши);
— становиться видимым и невидимым;
— перерисовываться;
— обеспечивать возможность перевода точки из системы координат окна в систему координат экрана;
— хранить идентификатор родителя (с возможностью изменить родителя);
— обеспечивать возможность работы с дочерними компонентами;
— обеспечивать возможность копирования данных в другой объект того же класса;
— обеспечивать возможность уничтожения объекта с высвобождением памяти;
— обеспечивать возможность посылать сообщения;
— определять имя класса, объектом которого является данный элемент.
При внимательном рассмотрении обязанностей, вменяемых объектам перечисленных классов, можно заметить, что некоторые из них совпадают, т. е. оказываются общими для объектов разных классов. Следует также отметить, что некоторые из обязанностей являются общими для объектов всех классов, а некоторые — лишь для ограниченного набора.
Логично было бы ввести дополнительные классы, объекты которых имели бы общие для рассмотренных классов обязанности. Тогда рассмотренные классы (TDataSource, TButton, TRadioButton, TListBox, TDBListBox) могли бы унаследовать функции, обеспечивающие выполнение этих обязанностей у введенных дополнительных классов (в объектно-ориентированном программировании имеется механизм, который так и называется — механизм наследования, — который делает доступными из дочерних классов свойства и методы, с учетом прав доступа, разумеется, из родительских (или базовых) классов).
Попытаемся выделить упомянутые классы и назначить им их обязанности:
Обязанности объектов класса Класс_1:
— обеспечивать возможность работы с дочерними компонентами;
— обеспечивать возможность копирования данных в другой объект того же класса;
— обеспечивать возможность уничтожения объекта с высвобождением памяти;
— обеспечивать возможность посылать сообщения;
— определять имя класса, объектом которого является данный элемент.
Обязанности объектов класса Класс_2:
— обрабатывать сообщения от клавиатуры;
— получать фокус ввода;
— определять, имеется ли фокус ввода;
— определять, может ли объект иметь фокус ввода (например, если элемент невидим, ему нельзя передать фокус ввода);
— обрабатывать сообщение BM_CLICK (происходит после нажатия кнопки мыши);
— становиться видимым и невидимым;
— перерисовываться;
— обеспечивать возможность перевода точки из системы координат окна в систему координат экрана;
— хранить идентификатор родителя (с возможностью изменить родителя).
Обязанность объектов класса Класс_3:
— обрабатывать сообщения WM_LBUTTONDOWN и WM_LBUTTONDBLCLK (нажатие и двойное нажатие левой кнопки мыши).
Обязанности объектов класса Класс_4:
— очищать список;
— обеспечивать возможность нахождения нескольких элементов из списка;
— определять номер элемента списка по координатам точки, принадлежащей объекту класса TDBListBox.
Теперь, исключив из множества обязанностей объектов рассматриваемых классов те, которые переданы дополнительным классам, перечислим оставшиеся обязанности:
Обязанности класса TDataSource:
— контролировать доступ пользователя к элементам TDataSet;
— обеспечивать возможность определения, подключен ли TDataSource к некоторому элементу TDataSet.
Итак, обязанности класса Tbutton — программно эмулировать нажатие кнопки; класса TradioButton — определять, какая из кнопок с зависимой фиксацией выбрана; классов TlistBox и TDBListВох — обеспечивать связь с источником данных (TDataSource).
В результате получена иерархия классов (рис. 8.12), которая обеспечивает исключение избыточности кода (функции, осуществляющие выполнение объектами разных классов одинаковых обязанностей, кодируются приблизительно, а иногда совершенно одинаково), повышает обозримость кода программы, а следовательно, потенциально сокращает время на ее отладку.
Теперь рассмотрим на рис. 8.13 фрагмент схемы иерархии классов для перечисленных элементов (до корневого суперкласса).
Сравнивая рисунки 8.12 и 8.13, можно заметить:
1. Класс_1 в нашей иерархии соответствует ветви TObject ? TPersistent ? TComponent;
2. Класс_2 — TControl —> TWinControl;
3. Класс_3 — TbuttonControl;
4. Класс_4 — TCustomListBox.
Если с двумя последними классами все понятно, то возникает вопрос: почему первые два класса нашей иерархии соответствуют не одному, а целым цепочкам классов C++ Builder? Дело в том, что в рассматриваемом примере описаны не все классы C++ Builder. Поэтому те из них, которые приводят к разветвлению двух первых цепочек, здесь просто не учтены. Например, элемент TImage, предназначенный для расположения на формах графических изображений, имеет следующую цепочку наследования классов: TObject ? TPersistent ? TComponent ? TControl ? TGraphicsControl, — т. е. цепочка TControl ? TWinControl превращается в дерево, на котором классы TWinControl и TGraphicsControl оказываются на одном уровне. Данный фрагмент схемы иерархии классов изображен на рис. 8.14.
Рис. 8.12. Предварительная иерархия классов
Рис. 8.13. Иерархия некоторых классов C++ Builder
Рис. 8.14. Фрагмент схемы иерархии
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Разработка приложений баз данных InterBase на Borland Delphi/C++ Builder/Kylix
Разработка приложений баз данных InterBase на Borland Delphi/C++ Builder/Kylix Что такое InterBase Express? Пользователи Borland Delphi 5-7 и Borland C++ Builder 5-6 редакций Professional и Enteiprise наверняка уже обратили внимание на закладку InterBase в палитре компонентов. Именно эта закладка и представляет собой набор
Использование библиотеки классов
Использование библиотеки классов Библиотека классов поставляется в виде исходных текстов. Поэтому для ее использования нужно выполнять следующие требования:* Явно добавить в проект файлы из каталога Lib:ole_liboledboledb_client_lib.cpp Основные классы для работы с OLE
Примеры использования библиотеки классов
Примеры использования библиотеки классов Для написания и тестирования примеров использовался Borland C++ Builder 3-й версии (с установленным пакетом исправлений, который доступен для скачивания на сайте компании Borland). Библиотека классов самостоятельно конфигурируется под
5. Пример программы на основе библиотеки WinLite
5. Пример программы на основе библиотеки WinLite В прилагаемом примере, построенном на основе разработанной автором библиотеки API-программирования WinLite, рассматриваются следующие проблемы:• создание и показ окон;• создание и показ диалогов;• загрузка ресурсов;• работа с
Глава 9 Среда разработки: библиотека базовых классов
Глава 9 Среда разработки: библиотека базовых классов Основным преимуществом объектно-ориентированных языков программирования, таких, как C++ и Smalltalk, является высокая степень повторного использования в хорошо спроектированных системах. Это означает, что для разработки
Соответствие между типами библиотеки базовых классов .NET, C# и CIL
Соответствие между типами библиотеки базовых классов .NET, C# и CIL В табл. 15.4 показано соответствие между типами базовых классов .NET и ключевыми словами C#, а также между ключевыми словами C# и командами CIL. Там же представлены сокращенные обозначения констант, используемые для
17.1. Определение иерархии классов
17.1. Определение иерархии классов В этой главе мы построим иерархию классов для представления запроса пользователя. Сначала реализуем каждую операцию в виде отдельного класса:NameQuery // ShakespeareNotQuery // ! ShakespeareOrQuery // Shakespeare || MarloweAndQuery // William && ShakespeareВ каждом классе
19.2.1. Исключения, определенные как иерархии классов
19.2.1. Исключения, определенные как иерархии классов В главе 11 мы использовали два типа класса для описания исключений, возбуждаемых функциями-членами нашего класса iStack:class popOnEmpty { ... };class pushOnFull { ... };В реальных программах на C++ типы классов, представляющих исключения, чаще
Delphi, Kylix и Borland C++ Builder
Delphi, Kylix и Borland C++ Builder IB Objects Этот продукт объединяет две давно известные системы компонентов для Firebird и InterBase, которые позволяют разработчикам использовать инструменты Borland IDE (Delphi, Kylix, и Borland C++ Builder) для реализации всех возможностей Firebird. Одна система совместима с
Пример разработки проекта дома
Пример разработки проекта дома Проектом в программе называется завершенная модель здания или группы зданий, включающая внутреннюю обстановку, элементы окружения (рельеф, объекты экстерьера), настроенное освещение и т. д. В зависимости от требований заказчика
Пример разработки модели одноэтажного коттеджа
Пример разработки модели одноэтажного коттеджа Начать работу необходимо с создания нового проекта. Выполните команду File ? New (Файл ? Новый) или воспользуйтесь комбинацией клавиш Ctrl+N.Переведите систему в метрическую систему измерений (команда меню Design ? Unit of Measure
Пример разработки дизайна комнат
Пример разработки дизайна комнат Программа Professional Home Design – Platinum предназначена скорее для дизайна, чем для построения модели здания, поэтому в качестве примера рассмотрим оформление интерьера двух комнат – кухни и спальни. Примечание С программой поставляются примеры
Пример иерархии
Пример иерархии В конце обсуждения полезно рассмотреть пример POLYGON-RECTANGLE в контексте более общей иерархии типов геометрических фигур. Рис. 14.2. Иерархия типов фигурФигуры разбиты на замкнутые и незамкнутые. Примером замкнутой фигуры кроме многоугольника является также
5.5. ПРИМЕР РАЗРАБОТКИ ОПИСАНИЯ ПРОЦЕССА "КИПЯЧЕНИЕ ВОДЫ В ЧАЙНИКЕ"
5.5. ПРИМЕР РАЗРАБОТКИ ОПИСАНИЯ ПРОЦЕССА "КИПЯЧЕНИЕ ВОДЫ В ЧАЙНИКЕ" Ниже показано пошаговое выполнение проектной процедуры на примере разработки описания процесса "Кипячение воды в чайнике". Дополните данное описание наглядными рисунками на листе 1 самостоятельно.Лист 2.