- •Часть 2
- •Оглавление
- •1. Структурный подход к программированию
- •1.1. Цели структурного программирования
- •1.2. Основные принципы структурного подхода
- •1.3. Спецификация программ
- •1.4. Метод пошаговой детализации
- •2. Предыстория объектно-ориентированного программирования
- •2.1. Введение в объектно-ориентированное программирование
- •2.2. Тип Объекты
- •2.3. Основные понятия ооп. Инкапсуляция. Наследование
- •X, y : integer; {координаты позиции}
- •XX,yy:array [1..1000] of integer;
- •2.4. Совместимость объектных типов по присваиванию
- •2.5. Описание типа-потомка
- •2.6. Полиморфизм
- •2.7. Виртуальные методы. Конструкторы и деструкторы
- •2.7.1. Правила работы с виртуальными методами
- •3. Типы данных и операторы языка object pascal в delphi
- •3.1. Предопределенные типы данных
- •3.1.1 Вещественные типы
- •3.1.2. Длинные строки
- •3.2. Структурированные типы
- •3.2.1. Множества
- •Var MySet: set of 'a'..'z';
- •3.2.2. Массивы
- •Var FlexArray: array of Real;
- •Var Ints: array of array of Integer;
- •3.2.3. Записи
- •Var Record1,Record2:tDateRec;
- •3.2.4. Указатели
- •I: Integer;
- •V1,v2,v3,v4,v5:Variant;
- •I:Integer;
- •3.3. Типы данных, специфичные для Windows
- •3.3.1. Приведение и преобразование типов
- •3.4. Операторы языка Паскаль
- •I:Integer;
- •I:Integer;
- •3.4.1. Элементы управления редактированием
- •3.5. Процедуры и функции библиотеки vcl
- •4. Реализация ооп на языке pascal
- •V: Real;
- •Наследование
- •Virtual;
- •Конструкторы и деструкторы
- •Перекрытие методов
- •5. Программирование в среде delphi
- •5.1. Основные элементы
- •5.2. Реализация объектно-ориентированного программирования
- •5.3. Разработка интерфейса приложения
- •5.3.1. Создание простейшего Windows-приложения
- •5.3.2. Создание Windows-приложения с метками и кнопками
- •Объект Свойство Значение
- •6.1.3. Меню Edit
- •6.1.4. Меню Search
- •6.1.5. Меню View
- •6.1.6. Меню Run
- •6.1.7. Меню Component
- •6.1.8. Меню Tools
- •6.1.9. Полоска кнопок быстрого доступа SpeedBar
- •6.1.10. Локальные меню. SpeedMenu
- •6.2. Работа с формами
- •6.2.1. Палитра компонентов
- •6.2.2. Object Inspector
- •6.2.3. Написание кода
- •6.2.4. Компиляция проекта
- •6.2.5. Интегрированный отладчик
- •6.2.6. Файлы, создаваемые системой
- •7. Структура delphi-программ
- •7.1. Разработка проекта Dialog
- •7.2. Процедуры вызова диалоговых окон
- •7.3. Преобразования типов
- •Var factW,optW,Rost,Delta:integer;
- •Var factW,optW,Rost,Delta:real;
- •7.4. Простейшие компоненты
- •7.4.1. Группы радиокнопок - компоненты RadioGroup, RadioButton, GroupBox
- •7.4.2. Компоненты выбора из списков - ListBox, ComboBox
- •7.4.3. Многострочные окна редактирования Memo и Richedi
- •7.4.4. Графические объекты
- •If OpenDialog1.Execute
- •Image1.Picture.LoadFromFile
- •7.4.5. Канва и пиксели
- •X, y :real; // координаты функции
- •7.4.6. Воспроизведение немых видео клипов – компонент Animate
- •7.4.7. Установка и настройка приложения: работа с файлами *.Ini
- •IniFile.Free;
- •Упражнения
- •8. Репозиторий объектов и эксперты
- •8.1. Страницы репозитория объектов
- •8.1.1. Страница New
- •8.1.2. Страница Forms
- •8.1.3. Страница Dialogs
- •8.1.4. Страница Data Modules
- •8.1.5. Страница Projects
- •8.2. Эксперты Delphi
- •8.2.1. Application Expert
- •8.2.2. Dialog Box Expert
- •9. Классы и модули
- •9.1. Классы и сокрытие информации
- •9.2. Классы и модули
- •9.3. Модули и область видимости
- •9.4. Модули и программы
- •9.5. Информация о типе на этапе выполнения
- •If MyAnimal is Dog then …
- •If MyAnimal is Dog
- •If MyAnimal is Dog then
- •10. Использование компонентов
- •10.1. Буксировка из одного компонента в другой
- •10.2. Обработка исключений
- •10.3. Восприятие ввода для пользователя
- •Val( Edit1.Text,Number,Code);
- •Val((Sender as tEdit).Text,Number,Code);
- •11.2. Различные роли элементов меню
- •11.3. Редактирование меню с помощью Menu Designer
- •If OpenDialog1.Execute
- •If SaveDialog1.Execute
- •Procedure tForm1.ViewEdit1Click(Sender:tObject); begin
- •If Panel1.Visible
- •If Buttons1.Enabled
- •12. Получение «ввода от мыши» и рисование в форме
- •12.1. События, связанные с мышью
- •12.2. Рисование в форме
- •If ssShift in Shift
- •If Circle then Canvas.Ellipse(Center.X-Radius.X,Center.Y-
- •Else Canvas.Rectangle(Center.X-Radius.X,Center.Y-
- •12.3. Черчение и рисование в системе Windows
- •13. Инструментальная линейка и строка состояния
- •13.1. Построение инструментальной линейки
- •Procedure tForm1.SpeedButton1Click(Sender:tObject); begin
- •If SpeedButton1.Down
- •13.2. Добавление всплывающих подсказок в линейку
- •13.3. Комбинированный список в инструментальной линейке
- •13.4. Построение строки состояния
- •14.1. Добавление второй формы в программу
- •14.2. Создание диалоговой панели
- •Задание № 1
- •Procedure tForn1.BitBtnClick(Sender:tObject); begin PageControl1.SelectNextPage(true);
- •Do ListBox1.Items.Add(PageControl1.Page[I].Caption);
- •14.3.1. Блокнот с набором ярлыков
- •If FontDialog1.Execute
- •15.2. Жизненный цикл программного средства
- •15.3. Понятие качества программного средства
- •15.4. Обеспечение надежности основной мотив разработки программных средств
- •15.4.1. Методы борьбы со сложностью
- •15.4.2. Обеспечение точности перевода
- •15.4.3. Преодоление барьера между пользователем и разработчиком
- •15.4.4. Контроль принимаемых решений
- •Литература
- •Часть 2. Объектно-ориентированное программирование
2.4. Совместимость объектных типов по присваиванию
Пусть объекты А и В однотипны, либо В – потомок А. Присваивание А:=В означает передачу (копирование) всех значений объекта В в поля объекта А. Если А и В не однотипны, либо А – потомок В, присваивание А:=В недопустимо. Это объясняется тем, что в первом случае для каждого поля в А есть соответствующее поле в В, а во втором случае это требование не выполняется.
2.5. Описание типа-потомка
С
интаксическая
диаграмма описания типа-потомка приведена
на рис. 2.2.
Рис. 2.2. Синтаксическая диаграмма описания типа
Далее следует стандартное описание объектного типа.
Задание для самостоятельной работы
Написать программу, которая создаёт и изменяет цветные квадраты. Описать тип Kvadrat – потомок типа Position, представляющий закрашенные квадраты с длиной стороны а (в пикселях).
Наследуемые поля X, Y представляют координаты центра квадрата.
Описать массив объектов.
Объекты (квадраты) должны «стихийно» увеличиваться и уменьшаться. Их случайное положение неизменно.
Увеличение производится слой за слоем (по принципу «снежного кома») в цикле: цветом данного квадрата проводятся четыре внешние линии, «касающиеся» сторон квадрата, этот процесс повторяется k-раз.
Аналогично выполняется и уменьшение, с той разницей, что проводимые линии находятся в квадрате (его края), их цвет – цвет фона а уменьшается.
Другой случай. На квадрат накладывается кайма цвета фона, и она сливается с внешней фоновой областью.
2.6. Полиморфизм
Полиморфизм, или «многообразие» – выражается в том, что под одним и тем же именем скрываются различные действия, содержание которых зависит от типа объекта. Полиморфизм предполагает определение класса или нескольких классов методов для родственных объектных типов так, что каждому классу отводится своя функциональная роль.
Полиморфизм неразрывно связан с наследованием и гласит, что каждый класс-наследник может обладать не только свойствами, унаследованными от предка, но и своими собственными. В частности, свойства предка могут быть перекрыты наследником, т. е. на место свойств предка могут быть подставлены свойства наследника.
Существование принципа полиморфизма является естественным следствием существования принципа наследования: наследование без изменения набора свойств не имеет смысла. Кроме того, без полиморфизма невозможно реализовать объединение различных объектов (классов) по некоторому набору свойств (невозможно абстрагироваться от части свойств объектов), а без этого теряется весь смысл подхода.
Например, метод «отобразить геометрическую фигуру на экране» - на самом деле не метод, а класс, так как характер фигуры определяет конкретный способ отображения (конкретный метод).
Методы одного класса обычно наделяются общим именем, например, Show, Init.
Проведем аналогию с процедурными типами. Сложному стандартному блоку (например, вычисляющему интеграл) передают тот или иной подчиненный блок (подынтегральную функцию). Без процедурного типа пришлось бы запасать копии стандартного блока, различающиеся в местах вызова подчиненного блока.
При работе с объектами может возникнуть сходная ситуация: сложный метод приходится описывать заново для каждого типа объекта, хотя различия в поведении объектов могут быть небольшими.
Изменяя алгоритм того или иного метода в потомках объекта, программист может придавать этим потомкам отсутствующие у родителя специфические свойства.
Для изменения метода необходимо перекрыть его в потомке, т. е. объявить в потомке одноименный метод и реализовать в нем нужные действия. В результате в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющих разную алгоритмическую основу, а следовательно, придающие объектам разные свойства. Это свойство и называется полиморфизмом объектов.
В Паскале полиморфизм достигается также виртуализацией методов, позволяющей родительским методам обращаться к методам потомков.
Позднее связывание. Несмотря на то что три перечисленных принципа называют «тремя китами ООП», сами по себе они не имеют смысла без наличия особого механизма, названного поздним (динамическим) связыванием. Приведем пример.
Допустим, что у нас создана программа, обрабатывающая объекты определенного класса (для определенности возьмем уже упоминавшийся класс «матрица»). Естественно, что программа разрабатывалась (и тестировалась) с использованием одного представителя данного (кстати говоря, абстрактного) класса, а точнее, его класса-наследника «двумерный массив». Разумеется, все обращения к элементам данных производились через соответствующие методы, абстрагирующие представление. Однако при этом идейно правильном подходе мы не сможем написать программу, которая могла бы обрабатывать других представителей класса «матрица», если у нас нет ничего, кроме реализации трех принципов ООП.
Действительно, в момент компиляции нашей программы мы жестко определяем, что при вызове метода доступа к элементу объекта класса «матрица» вызывается метод объекта класса-наследника «двумерный массив». Даже если мы разместим по тем же адресам (или передадим в качестве параметров) объекты других классов-наследников («блочная матрица», например), все равно будет вызываться метод класса «двумерный массив». Это и приведет к блокировке программы.
Следовательно, необходим механизм, который в процессе выполнения программы определял бы принадлежность объекта конкретному классу и производил бы вызов методов, относящихся к данному классу. Этот механизм и получил название механизма позднего связывания.
Однако позднее связывание должно быть применено не ко всем методам, а только к специфическим для каждого класса-наследника. К примеру, вызов метода обращения должен быть одинаков для всех объектов класса «матрица» - алгоритм одинаков для всех матриц. То есть все методы класса по способу вызова делятся на две группы:
методы, для которых механизм позднего связывания не применяется; они, насколько нам известно, не получили названия (за исключением «обычные»);
методы , для которых этот механизм применяется; они получили название «виртуальные методы» (среди них еще выделяют «динамические виртуальные методы», но они по принципам вызова не отличаются).
Таким образом, концепция ООП является естественным развитием концепции модульного программирования, направленным на увеличение производительности программиста, приближение процесса программрования к процессу человеческого мышления и стандартизацию как программ, так их и подхода к ним.
Объектно-ориентированное программирование базируется на трех принципах и одном механизме: инкапсуляция, наследование, полиморфизм и позднее связывание (иногда к ним приписывают программирование, управляемое сообщениями).
