Практикум по программированию на delphi
ЮЖНО-УРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
К592
А.С Козлов
ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ НА DELPHI
Учебное пособие
Челябинск 2003
Глава 1. ВВЕДЕНИЕ В ОСНОВЫ ПРОГРАММИРОВАНИЯ НА DELPHI
§1.1. Особенности программирования на Delphi
Delphi - это инструмент для создания программных продуктов, который изначально создавался для разработки программных комплексов, функционирующих в операционной системе Microsoft Windows. Только начиная с 6-й версии, в Delphi появились некоторые возможности переносить программные продукты на платформу Unix. Поэтому главные отличия программирования на Delphi от, например, программирования на Turbo Pascal обусловлены особенностями самой операционной системы Windows, среди которых самыми значительными являются: многозадачность и объектно-ориентированная структура Windows, доступ к которой возможен с использованием MFC (Microsoft Foundation Classes) и Windows API (Application Programming Interface), в первую очередь позволившая стандартизовать графический интерфейс пользователя.
Вторым важнейшим отличием Delphi является то, что Delphi - это RAD- средство (Rapid Application Development), которое, сводя к минимуму системное программирование, позволяет концентрироваться на предметной области и максимально быстро создавать работающее приложение. Программирование для Windows непосредственно с использованием MFC и Windows API является достаточно нетривиальной вещью, поскольку требует знания и умения применять таких внутренних элементов операционной системы как индексы, контексты, обратные вызовы и пр. Однако поскольку многие вещи присутствуют в каждой функционирующей Windows-программе, Delphi скрывает общие детали общения программы с операционной системой. В самом начале создания проекта программист Delphi имеет некий каркас приложения. Так, если создать в Delphi новое приложение и, не добавляя никаких элементов управления и не делая никаких других изменений, запустить его на выполнение, то на экран выведется пустое окно, которое может быть развернуто, перемещено, может изменять свои размеры и минимизироваться, то есть имеет все, что нужно всем программам Windows. Эта пустая Delphi-программа может сравниваться с только что построенным зданием завода, в котором есть стены, обогревание, вентиляция, освещение, связь, но нет конкретного назначения [8].
Следует отметить, что особенностью программирования в Windows является и то, что не весь код программы находится даже в каркасе приложения. Определенная часть фактически является самой Windows. Граница между программами Delphi и собственно Windows - гораздо более расплывчатая, чем между программами Turbo Pascal и DOS. Например, коды для кнопок и стандартных окон диалога полностью получены из Windows. Delphi использует их, выполняя соответствующие вызовы в Windows.. Но каркас Delphi спроектирован так, что программисту все равно - где находится код для кнопок, диалогов и других элементов управления, как они хранятся и вызываются. Все это значительно уменьшает сложность разработки программного обеспечения.
Каркас приложения может обрабатывать входные сигналы — сообщения от мыши и клавиатуры. Но пока программист не описал, что должно делаться в ответ, эти сигналы игнорируются. Приложение откликается только на нажатия клавиш мыши и клавиатуры, которые запускают действия, фундаментальные для всех Windows программ: изменение размера, увеличение, перемещение и другие команды, которые воздействуют на размер и позицию окна приложения на рабочем столе Windows.
Программирование в Delphi является событийным. Когда пользователь нажимает кнопку на форме Delphi или клавишу клавиатуры, то происходит событие. Этому событию программист может сопоставить фрагмент выполняемого кода обработки события (отклик на событие). Если отклик не создан, то ничего не происходит. События генерируются Windows, Delphi перехватывает их, обрабатывает и само генерирует событие, а приложение генерирует отклики на события Delphi. У программиста остается возможность обрабатывать события Windows напрямую, минуя Delphi. В целом программирование в Delphi состоит из создания кода подпрограмм, выполняющихся при возникновении событий (рис. 1.1), основной алгоритм программы как бы скрыт - его реализует Delphi совместно с Windows. Это отличается от программирования в среде DOS, где выполнение кода можно видеть в любой момент работы программы: от того места, где он начинается при запуске программы, до того места, где он заканчивается, когда программа завершает свое выполнение.
Рис. 1.1. Взаимодействие прикладной программы, Delphi и Windows |
Процедуры обработки события должны быть короткими и лаконичными, при этом сложные алгоритмы целесообразно выносить в отдельные библиотеки кода на Object Pascal.
§1.2. Delphi. Основные характеристики продукта
Можно выделить следующие важнейшие структурные составляющие Delphi. I. Современный язык программирования Object Pascal. Delphi базируется на языке программирования Object Pascal. Компилятор Object Pascal обеспечивает высокую производительность за счет легкости разработки и быстрого времени
проверки готового программного блока, характерного для языков четвертого поколения (4GL) и в то же время обеспечивает качество кода, характерного для компилятора третьего поколения (3GL). Delphi обеспечивает достаточную производительность без необходимости писать вставки на Си или даже машинных кодов (хотя это возможно), поскольку в Delphi компиляция производится непосредственно в машинный код, в отличие от компиляторов, превращающих программу в так называемый р-код, который затем интерпретируется виртуальной р-машиной (например, Java). Компилятор позволяет создавать готовые приложения как в виде исполняемых модулей, так и в виде динамических библиотек, которые можно использовать в других приложениях, в том числе написанных на других языках программирования. Object Pascal полностью поддерживает современные концепции программирования: инкапсуляцию, наследование, полиморфизм, делегирование, управление событиями и обработку исключительных ситуаций.
· Открытая объектно-ориентированная модель компонент. Впервые такая технология появилась в языке программирования Visual Basic. Соответствующий стандарт компонент назывался VBX (он поддерживается в Delphi). Однако визуальные компоненты в Delphi обладают большей гибкостью. Они встроены в среду разработки приложений и представляют набор типов объектов, используемых в качестве фундамента при строительстве приложения. В процессе построения приложения разработчик выбирает из палитры компонент готовые компоненты и видит результаты своей работы еще до компиляции. Этот набор типов компонентов называется Visual Component Library (VCL). В VCL есть такие стандартные элементы управления как строки редактирования, статические элементы управления, строки редактирования со списками, списки объектов.
Ключевой особенностью Delphi является возможность не только использовать визуальные компоненты для строительства приложений, но и создание новых компонент. Такая возможность позволяет разработчикам встраивать новые инструменты в существующую среду, улучшить или полностью заменить существующие по умолчанию в Delphi компоненты. Классы объектов построены в виде иерархии, состоящей из абстрактных, промежуточных и готовых компонент. Разработчик может пользоваться готовыми компонентами, создавать собственные на основе абстрактных или промежуточных, а также создавать собственные объекты.
· Визуальное построение приложений из программных прототипов. Delphi основано на методе разработки программного обеспечения two-way tools - однозначное соответствие между визуальным проектированием н классическим написанием текста программы. Это означает» что разработчик всегда может видеть код, соответствующий тому, что он построил при помощи визуальных инструментов и наоборот. В Delphi это выражается соответствием между формами и модулями форм.
Формы - это объекты, в которые помещаются другие объекты для создания пользовательского интерфейса вашего приложения. Модули форм состоят из кода, который реализует функционирование приложения через описание классов.
используемых в форме, и обработчиков событий для форм и их компонент. Информация о формах хранится в двух типах файлов - *.dfm и *.pas, при этом первый тип файла хранит образ формы и ее свойства, второй тип является модулем формы. Оба файла автоматически синхронизируются Delphi, так что если добавить в проект новую форму, автоматически будет создан связанный с ней модуль, а его имя будет добавлено в проект. Такая синхронизация и делает Delphi two-way-инструментом, обеспечивая полное соответствие между кодом и визуальным представлением.
4.Масштабируемые средства для построения баз данных. Delphi позволяет использовать библиотеку визуальных компонент для быстрого создания надежных приложений, которые легко расширяются до приложений с архитектурой клиент-сервер. Предусмотрены специальные наборы, компонент, отвечающихза доступ к данным, и компонент, отображающих данные. Компоненты доступа к данным позволяют осуществлять соединения с БД, производить выборку, копирование данных и т.п. Компоненты визуализации данных позволяют отображать данные в виде таблиц, полей, списков. Отображаемые данные могут быть текстового, графического или произвольного формата. VCL содержит большой набор компонент, значительно упрощающих разработку приложений для СУБД с архитектурой клиент-сервер, трехзвенной архитектурой (MIDAS),а в последних версиях Delphi поддерживаются такие передовыетехнологии доступа к данным как создание Web-сервисов на основе
платформы .Net.
Среда разработчика Delphi
Важнейшим элементом Delphi является интерфейс программы, который иначе называется интегрированной средой разработки (ЮЕ - Integrated Development Environment) и обеспечивает программисту возможность визуального программирования (WYSIWYG - What You See Is What You Get). Суть визуального проектирования заключается в том, что среда предоставляет оконные или другие формы (в приложении их может быть несколько), на которые с помощью мыши переносятся и размещаются компоненты, имеющиеся в Delphi. При этом можно легко изменять размеры, расположение формы и компонентов. В это время Delphi автоматически формируетКоды программы, включая в нее соответствующие фрагменты, описывающие данный компонент. А затем в различных диалоговых окнах пользователь может изменить Заданные по умолчанию значения каких-то свойств этих компонентов и, при необходимости, написать обработчики каких-то событий. То есть программирование сводится к размещению компонентов на форме, заданию некоторых их свойств и написанию, при необходимости, обработчиков событий.
Фактически такой подход избавляет от необходимости каждый раз компилировать и запускать программу, для того чтобы выбрать наиболее удачные параметры интерфейса пользователя.
Среда программирования является настраиваемой, то есть ее внешний вид (структура, расположение и количество окон, внешний вид главного меню,
инструментальных панелей, палитры компонентов, выделение синтаксиса цветом) может быть изменен в соответствии с предпочтениями программиста. Можно хранить несколько настроек среды для эффективного выполнения разных проектных операций: разработки форм, работы с модулями форм, отладки приложения. На рис. 1.2 представлена конфигурация по умолчанию для Delphi 7.
Основные составляющие среды: главное окно (главное меню, инструментальная панель, панель палитры компонентов и панель сохранения и выбора различных конфигураций окна IDE), окно редактора форм, окно редактора кода, окно инспектора объектов, окно дерева объектов.
Главное окно
Главное окно по умолчанию располагается сверху. Вверху главного окна располагается главное меню. Справа от него находится панель сохранения и выбора различных конфигураций окна IDE, содержащая выпадающий список и две быстрые кнопки. Ниже главного меню находятся: слева - инструментальная панель с быстрыми кнопками, состоящая из шести групп: Standard, View, Debug, Custom, Component Palette, Desktops. Также существует группа кнопок Internet, но она по умолчанию отключена. Функционально кнопки дублируют наиболее часто используемые элементы главного меню. Справа от инструментальной панели расположена палитра компонентов Delphi.
Окно редактора форм
Окно редактора форм представляет собой проектируемую форму, покрытую сеткой из точек, в узлах которой размещаются компоненты. Для помещения компонента но форму его тип выбирают в палитре компонентов и затем щелчком определяют место формы, на которое он размещается. Если необходимо перенести сразу несколько компонентов одного типа, то можно выбрать требуемый компонент с нажатой клавишей Shift, тогда после каждого щелчка мышью на форме будет появляться новый компонент выбранного типа (отмена этого режима - нажатие кнопки в виде стрелки слева в палитре компонентов).
Компоненты можно копировать и вставлять из одной формы в другую или дублировать компоненты в одной и той же форме. При этом копируются все свойства и сохраняются ссылки на присвоенные обработчики событий, а также при необходимости изменяется имя компонента. Возможно копирование компонента из редактора кода в конструктор форм и обратно, что позволяет редактировать текстовое описание компонента.
Если при копировании компонента необходимо кроме описания компонента сохранить и код обработчиков событий, то можно использовать шаблоны компонентов. Это делается через команду меню Component->Create Component Template. Вся информация о шаблонах компонентов хранится в файле Delphi32. DCT.
Окно редактора кода
Рис. 1.3. Окно редактора кода Переключение между окнами редакторов форм и кода осуществляется с помощью выбора соответствующего окна мышью или нажатием клавиши F12. Окно редактора кода состоит из двух частей (рис. 1.3). Слева находится окно Code
Expiorer, в котором в виде дерева представлены все описания классов, переменных и констант в используемых модулях. При двойном щелчке на шементе дерева фокус ввода перемещается к его описанию в объявлений класса (раздел interface модуля). Нажав Ctrl+Shift и стрелку вниз можно перейти к реализации элемента (раздел implementation модуля).
Справа находится окно специализированного программного редактора. В нем поддерживается выделение цветом различных синтаксических элементов, можно работать сразу с несколькими файлами, расположенными на разных закладках. Переключение между закладками - Ctsl+Tab. Настройки редактора хранятся на странице главного менюTools->Јditor Options.
Редактор кода имеет ряд специальных возможностей, таких как автоматическая генерация кода класса (Class Completion), автоматическое дописывание кода (Code Completion), автоматическое перемещение по ходу в режиме гипертекста, автоматическое использование шаблонов кода (Code Templates), закладки, диаграммы, а также удобные средства отладки программ. Окно редактора поддерживает технологию Drag&Dock, то есть к окну редактора можно прицепить другие окна, например Code Explorer, Object Inspector и т.д.
Автоматическая генерация кода класса. Если в описание класса добавить описание нового метода, или свойства, то по нажатию Ctrl+Shift+C Delphi добавляет каркас этого метода (свойства) в разделе implementation. Эта функция также работает в обратную сторону: если метод описан в разделе implementation, то описание метода помещается в раздел Public соответствующего объекта. Клавиши перемещения вверх и вниз в сочетании с нажатыми и удерживаемыми клавишами Ctrl и Shift осуществляют перемещение между секциями interface и implementation текущего модуля, показывая реализацию метода или наоборот его заголовок.
Автоматическое дописывание кода позволяет выбирать свойство или метод объекта, набирая первые буквы его названия. Для вызова Code Completion просто набирается имя объекта, затем ставится точка, после этого появляется список вариантов. Чтобы заставить отобразиться пропавший список можно использовать Ctrl+Space. Автоматическое дописывание кода действует и при введения операции присваивания (символ :=).
Code Parameters (параметры функции) отображает (в виде всплывающей подсказки) типы параметров метода или функции во -время их последовательного набора. Список возникает после набора имени метода и открывающей скобки, принудительно можно заставить список отобразиться, нажав Ctxi+Shift+Space.
Автоматическое перемещение по коду в режиме гипертекста. Если пои нажатой клавишеCtrl нажать левую клавишу мыши над идентификатором, то редактор попытается отыскать исходный текст модуля,в котором объявлен соответствующий тип, подпрограмма или глобальная переменная и, если поиск окажется успешным, загрузит текст модуля в окно кода и установит курсор в
начале описания типа (подпрограммы, переменной). Это же можно сделать, выбрав во всплывающем меню пунктFind Declaration [2].
Поиск исходного текста с описанием типа идет в следующем порядке:
· Project->Options->Directories->Conditionals->Search Path;
· Project->Options->Directories->Conditionais->Debug Search Path;
· Tools->Environment Options->Library->Browsing Path;
· Tools->Environment Options->Library->Library Path.
Если мышь перемещается над идентификатором при нажатой клавише Shift, рядом с указателем мыши появляется всплывающая подсказка, в которой сообщается, к какому элементу языка относится идентификатор, а также имя модуля и номер строки в нем, где этот идентификатор впервые описан.
Шаблоны кода позволяют использовать предопределенные фрагменты кода. Список всех шаблонов можно вызвать поCtrl+J. Можно определять свои шаблоны на закладкеTools->Editor Options->Source Options->Edit Code Templates.
Закладка используется для быстрой навигации по тексту программы. Она может быть создана в любом месте текста программы с использованием всплывающего меню либо при нажатииCtrl+Shift и цифру от 0 до 9, определяющую номер закладки. Повторное нажатие этих клавиш уберет закладку, если курсор находится на строке с закладкой, если курсор на другой строке, то закладка переместится на текущую строку. Для того чтобы перейти к строке с закладкой необходимо нажатьCtrl+номер закладки.
Па нижней кромке окна редактора текстов располагаются ярлыки двух вкладокCode иDiagram. Щелчок на ярлыкеDiagram активизирует вкладку диаграмм. Диаграммы создаются перетаскиванием компонент из окна дерева объектов в поле диаграмм.
Отладка программ. Если программа запущена из среды Delphi, то ее можно прервать во время ее выполнения клавишамиCtrl-F2 или путем установки точки контрольного останова. Трассировка прерванной программы осуществляется с использованием клавишF7 иF8.
Точка контрольного останова определяет оператор в программе^ перед выполнением которого программа прерывает свою работу, и управление передается в среду Delphi. Она задается клавишейF5 или просто щелчком мыши в служебной зоне слева от строки кода. Окно точек останова вызывается командой главного менюView->Debug windows->8reakpoints и содержит список всех установленных в проекте точек останова. Точки останова можно объединять в группы, чтобы впоследствии одновременно включать/выключать несколько точек останова. У каждой точки можно указать следующие параметры: Filename - путь и имя файла,Line number - номер строки от начала файла, Condition - условие останова в виде логического выражения.Pass count -в поле этого списка можно указать количество проходов программы через контрольную точку без прерывания вычислений.
Если щелкнуть на кнопкеAdvanced, то на панелиActions с любой точкой прерывания можно связать одно или несколько действий:Break - простой останов перед выполнением помеченного оператора;Ignore subsequent exceptions - игнорировать возможные последующие исключения в текущем отладочном сеансе до очередной точки останова;Handle subsequent exceptions - после установки этого флага отменяется действие предыдущего флага;Log message - можно определить произвольное сообщение, помещаемое в лог при прохождении через точку останова. Просмотр лога осуществляется через команду главного менюView->Debug windows- >Event Log; Eval expression - позволяет вычислить выражение и поместить его результат в сообщениеLog.
Состояние переменных или выражения во время отладки можно задавать и отслеживать в окне отладки, вызываемого по клавишамCtrl+Alt+W или командой главного менюView->Debug windows->Watches.
Окиоинспектора объектовЭтот инструмент служит для изменения значений свойств (Properties) и событий (Events) объектов формы в момент проектирования формы. Для этого в окне инспектора объектов имеется список всех компонент, размещенных на форме, страница свойств инспектора объектов, показывающая свойства того объекта, который в данный момент выделен. Страница событий содержит все события, на которые может реагировать выбранный объект. Рядом с именем события может быть или пустое поле (обработчик события не определен) или имя процедуры, обрабатывающей событие.
Определить обработчик события можно двумя способами.
. Выделить компонент прямо в форме, либо с помощью списка инспектора объектов, выбрать страницуEvents в Object Inspector и дважды щелкнуть в пустом поле напротив нужного события или ввести имя метода и нажать Enter.
. Дважды щелкнуть непосредственно на компоненте, расположенном на проектируемой форме. В этом случае Delphi создаст обработчик для события по умолчанию, в зависимости от типа компонента это может быть событие OnClick, OnChange илиOnCreate.
Удаление обработчика события можно производить или вручную, удалив все ссылки на него, или автоматически. Для автоматического удаления необходимо очистить весь код соответствующей процедуры, оставив лишь заголовок и ключевые словаbegin иend При сохранении или компиляции проекта, Delphi автома1Пчески убирает все пустые методы и ссылки на них в описании формы.
Окно дерева объектов
Предназначено для наглядного отображения связей между отдельными объектами (компонентами), размещенными на активной форме или активном модуле данных. Щелчок на любом объекте в этом окне активизирует соответствующий компонент в окне формы и отображает свойства этого компонента в инспекторе объектов. Двойной щелчок вставляет в окно кода заготовку для обработчика события по умолчанию. Объект можно перетаскивать в окне дерева объектов, меняя его владельца (свойство Parent).
Кроме вышеописанных окон, Delphi содержит следующие инструменты: » менеджер проектов - средство просмотра модулей в проекте, показывает имена файлов, время/дату выбранных форм и пр., осуществляет навигацию по модулям н формам проекта;
· дизайнер меню - позволяет создавать меню, сохранить созданные в виде шаблонов и затем использовать в их в любом приложении;
· редактор ресурсов-картинок (Image Editor);
· эксперты (экспорт форм, работающих с базами данных, эксперт стилей и шаблонов приложений, эксперт шаблонов форм) - инструментальные программы, облегчающие проектирование и настройку приложений.
История создания ООП
Как и в любой научной дисциплине в программировании время от времени появляются так называемые революционные идеи. Главными стимулами всех нововведений являются стремление ускорить процесс создания надежных программных средств и увеличение сложности разрабатываемых программ, что становится возможным благодаря развитию аппаратной базы ЭВМ. Сложность программ определяется тем, что алгоритмы описывают модели все более сложных реальных систем, программы становятся очень большими по объему, данные имеют сложную структуру, трудоемкость разработок достигает миллионов человеко-часов.
Исторически первой была идея процедурного программирования. Центральная роль в ней отводилась алгоритмам. На основе структурного подхода предлагалось осуществлять декомпозицию алгоритма задачи, сводя его к множеству типовых процедур. Этот подход позволил, во-первых, повысить надежность и скорость разработки программ за счет реиспользования уже написанных алгоритмов, во-вторых, организовать совместную работу программистов над одним проектом. Последовательное использование идеи процедурного программирования привело к созданию обширных библиотек подпрофамм, содержащих множество сравнительно небольших процедур, из которых, как из кирпичиков, можно строить «здание» программы. Примером языка программирования, основанного на этой идее,можно считать Фортран.
Однако процедурный подход оказался хорошим только для чисто вычислительных математических задач, которые оперируют с достаточно небольшим количеством простых типов данных. По мере прогресса в области вычислительной математики акцент в программировании стал смещаться от собственно алгоритмов в сторону организации данных. Оказалось, что эффективная разработка сложных программ нуждается в действенных способах контроля правильности использования данных. Поэтому следующей революционной идеей сталаконцепция типов данных. При этом в первом поколении языков программирования было введено понятие типа данных, а во второе поколение (к которому относится и стандартный язык Паскаль) была добавлена идея определяемых пользователем типов данных, таких как, например, массивы, строки, множества, записи. Это привело к созданию Алгола-60, Паскаля. Си и других языков программирования, имеющих более или менее развитые структуры типов данных [6].
Третий революционный шаг был направлен на то, чтобы отказаться от применения библиотек подпрограмм на основе примитивной технологии вставки в текст программы исходных текстов своих предыдущих наработок. Для этого сначала использовались внешние процедуры и функции, а впоследствии был предложенмодульный подход к разработке программ.Модульное
программирование предусматривает механизмы раздельной компиляции частей программы с последующей их сборкой перед выполнением. Модуль является иеким «черным ящиком», который скрывает детали реализации определенных действий, в нем спрятаны данные и алгоритмы их обработки. Через интерфейс модуля можно выполнить необходимые действия, реализованные в нем. Практика программирования показывает, что структурный подход в сочетании с модульным программированием позволяет получать достаточно надежные программы, размер которых не превышает 100 ООО операторов. Узким местом модульного программирования является то, что ошибка в интерфейсе при вызове подпрограммы выявляется только при выполнении программы (из-за раздельной компиляции модулей обнаружить эти ошибки раньше невозможно) [13].
Стремление уменьшить количество связей между отдельными частями программы привело к появлению объектно-ориентированного программирования. В его основе лежит концепция абстрактного типа данных - типа, связывающего данные и обрабатывающие их алгоритмы в единое целое - объект. Фактически ООП можно рассматривать как модульное программирование нового уровня, когда вместо механического объединения процедур и данных акцент делается на их семантическую (смысловую) связь. Кроме этого, объектный подход предлагает новые технологические средства разработки такие как наследование, полиморфизм, композиция, позволяющие конструировать сложные объекты из более простых. В результате существенно увеличивается показатель повторного использования кодов, появляется возможность создания библиотек объектов для различных применений и разработчикам предоставляются дополнительные возможности создания систем повышенной сложности.
Основной недостаток ООП - некоторое снижение быстродействия за счет более сложной организации программной системы. Преимущества ООП в полной мере проявляются лишь при разработке достаточно сложных программ. Попытки использовать ООП для программирования несложных алгоритмов, связанных, например, с вычислениями по готовым формулам, выглядят как искусственное нагромождение ненужных языковых конструкций [7].
Наука не стоит на месте и, несмотря на то, что объектно-ориентированный подход занимает в настоящее время доминирующие позиции, разрабатываются новые концепции, например функциональное программирование и др., направленные на дальнейшее совершенствование технологии создания программных комплексов.
Основные принципы ООП
OOli основано на трех фундаментальных понятиях: инкапсуляция, наследование, полиморфизм.
Принципы ООП в языках программирования воплощаются через специальный тип данных - класс. Класс может быть определен как абстрактное описание (руппы объектов, каждый из которых находится в определенном состоянии, но все они способны выполнять одинаковые операции. Если класс - это гнп данных,
то конкретный экземпляр этого типа данных (переменная данного типа)втерминах ООП называется объектом. Например, кнопка на форме - объект, который имеет состояние (она может быть нажатой или отжатой, видимой или невидимой и пр., может иметь какую-то надпись и название) и над которым разрешены некоторые операции, как и над всеми кнопками, такие как нажатие/отжатие мышью, передача/потеря фокуса ввода и т.д. Можно привести множество примеров объектов из реальной жизни таких как машина, ручка и т.п.
Класс может иметь в своем составе поля, методы и свойства, где поля содержат данные о состоянии объектов класса, а методы - алгоритмы их обработки. Свойства - это специальная конструкция языка, определяющая взаимосвязь полей классов и методов чтения/записи информации из/в них.
Поля объекта аналогичны полям записи, это данные уникальные для каждого созданного в программе экземпляра класса. В отличие от полей, методы у всех объектов одного класса общие (рис. 2.1 ). Методы - это процедуры и функции, описанные внутри класса и предназначенные для операций над его полями. В состав класса входит указатель на специальную таблицу, где содержится вся информация, нужная для вызова метода. От обычных процедур и функций методы отличаются тем, что им при вызове передается указатель на тот объект, который их вызвал. Поэтому обрабатываться будут поля именно того объекта, который вызвал метод.
Расположение объектов, их полей и методов в оперативной памяти
Внутри программы классы выполняют следующие основные функции. 1. Классы определяют абстракции «целое/ч^сть» и «общее/частное». Можно использовать классы, чтобы определить реальные объекты, независимо от их сложности. Если объект очень сложен, можно использовать классы для описания отдельных его подэлементов (или подсистем), в этом случае используется абстрация «целое/часть». Например, объект «Линия» состоит из объектов
«Точка». Абстракция «общее/частное» выделяет общие свойства группы объектов, что позволяет описать класс, содержащий только эти «общие» свойства. При этом объекты вновь созданного класса могут не иметь реального воплощения. Наследники этого класса получают эти свойства по умолчанию и могут дополнять и заменять их собственными «частными» свойствами. Таким образом, абстракция «общее/частное» используется для реализации принципа наследования.
2. Классы служат основой модульности программы. Например, в языке Object Pascal можно помещать каждый новый класс (определение формы или другого элемента) в его собственном модуле, разделяя даже большое приложение на маленькие управляемые части. Способ, которым Delphi обрабатывает исходный текст форм, когда каждой форме сопоставлен отдельный модуль, ведет именно к такому подходу. В соответствии с принципом модульности каждый класс инкапсулирует свои элементы.
Инкапсуляция
Инкапсуляция - это объединение в единое целое данных и алгоритмов обработки этих данных. Кроме собственно объединения данных и методов внутри объекта, классическое правило объектно-ориентированного программирования утверждает, что для обеспечения целостности объекта нежелателен прямой доступ к его полям извне: чтение и обновление их содержимого должно производиться только посредством вызова соответствующих методов объекта.
Инкапсуляция позволяет получить следующие преимущества.
· Повышается надежность разрабатываемых программ, так как локализованные в объекте алгоритмы обмениваются с программой сравнительно небольшими объемами данных, количество и тип которых тщательно контролируются. В результате замена или модификация алгоритмов и данных, инкапсулированных в объекте не влечет плохо прослеживаемых изменений, влияющих на программу в целом (в ООП практически не используются глобальные переменные).
· Увеличивается легкость распространения и повторного использования программного кода за счет возможности обмена объектами, переноса их из одной программы в другую.
Наследование
Наследование - это свойство объектов порождать своих потомков, передавая им при этом свои свойства и методы. Потомок автоматически наследует от своего родителя все его поля и методы, но может дополнять объекты новыми полями и заменять методы родителя. Например, из «кнопки вообще» можно получить: кнопки, хранящие кроме надписи изображение или анимацию; кнопки, фиксирующие свое состояние; кнопки, имеющие произвольную форму и т.п. Однако все кнопки объединены некоторыми общими характеристиками, свойствами и методами, которые и унаследованы от родительского класса «кнопок вообще».
Принцип наследования решает проблему модификации свойств объекта и придает ООП исключительную гибкость. При работе с объектами программист обычно подбирает уже реализованный объект наиболее близкий по своим
свойствам дл« решения конкретной задачи и создает одного или нескольких потомков, которые автоматически умеют делать то, что реализовано в родителе. После этого к этим .потомкам добавляются уникальные для них функции. Теперь, если обнаружится ошибка, и она будет исправлена в классе-родителе, изменения автоматически перенесутся на все дочерние классы. Наследование - очень мощная конструкция языка, -существуют следующие рекомендации по ее использованию.
· Наследование представляет собой специализацию. Подкласс рассматривается как особый случай родительского класса.
· Наследование используется, чтобы выразить обобщение. Если есть класс для кнопок, класс для полей ввода и класс для списков, можно придумать основной класс элементов управления и использовать его как родительский класс для каждого другого класса. Это дает возможность совместного использования общих элементов и некоторого обшего кода.
· Наследование - это способ избежать дублирования кода. Вместо использования операций копирования и вставки для построения двух аналогичных классов гораздо проще использовать один из них в качестве родительского для второго. Кроме сохранения такого кода, можно сократить время отладки, и в будущем будет проще вносить изменения, так как имеется только одна версия кода.
· Родительский класс и подкласс имеют некоторую форму совместимости типов, что также позволяет эффективно использовать механизм наследования для обмена информацией между объектами разных, но близких типов.
Полиморфизм
Полиморфизм - это техника, позволяющая присвоить родительскому объекту один из его дочерних объектов: Parent :=Child, при этом поведение родительского объекта изменяется в зависимости от особенностей присвоенного ему дочернего объекта. Таким образом, один и тот же (родительский объект) может вести себя по-разному. Отсюда и произошло слово «полиморфизм», которое дословно переводится с греческого как «множество форм».
Рассмотрим полиморфизм на примере объектов следующих классов: ' TEllipseBtn (скругленная кнопка), TSquareBtn (квадратная кнопка) и TCircleBtn (круглая кнопка), TRectBtn (прямоугольная кнопка). Предположим, что каждый из этих классов является потомком базового класса ТВtn (обобщенная кнопка), который содержит виртуальный метод Draw. Все потомки TBtn также содержат метод Draw, но каждый