- •Заголовок программы
- •Раздел объявлений и соглашений
- •Раздел текстов процедур и функций
- •Тело программы
- •Структура программы, или главный порядок
- •4. Зарезервированные слова, идентификатор, константа, переменная, типизированная константа и инициализированная переменная. Зарезервированные слова Turbo Pascal 7.0
- •Идентификаторы или имена
- •4.2. Константы в Turbo Pascal 7
- •4.2.2. Вещественные константы
- •4.2.3. Строковые и символьные константы
- •4.2.4. Константные выражения
- •4.2.5. Типизированные константы
- •4.2.1. Целые константы
- •5. Арифметические и логические выражения, операнд, операция, оператор, комментарии.
- •1. Арифметические операции
- •2. Логические операции
- •8. Порядковые, перечисляемые, интервальные и структурированные типы.
- •9. Строки, массивы, множества, записи, указатели, файлы.
- •10. Иерархические структуры типов, данных и подпрограмм.
- •11. Описание, объявление и способы инициализации данных. Свойства типов и данных
- •12. Виды и приоритет элементарных операций (унарные, бинарные, арифметические, логические, отношения). Оператор присваивания и автоматическое преобразование типов операндов. Логические операции
- •13. Условные и безусловные операторы. Операторы перехода и выбора.
- •Оператор безусловного перехода
- •Оператор выбора
- •Цикл с предусловием
- •Цикл с постусловием
- •15. Директивы компилятора (препроцессора).
- •16. Процедуры и функции, их объявление, описание, вызов. Процедурные типы.
- •17. Формальные и фактические параметры. Особенности передачи параметров.
- •18. Стандартные и собственные модули, их организация.
- •19. Встроенные процедуры ввода-вывода информации. Спецификация формата вывода.
- •20. Подпрограммы для работы со строками.
- •22. Открытые и динамические массивы.
- •23. Динамическое определение и преобразование типа переменной.
- •24. Встроенные процедуры и функции для работы с динамическими элементами.
- •25. Указатели, односторонние и двухсторонние списки. Приемы работы с указателями.
- •Списки с двойной связью
- •28. Объектно-ориентированное программирование. Основная идея, принципы, понятия.
- •29. Классы, объекты, методы и свойства.
- •30. Инкапсуляция, наследование, полиморфизм. Конструкторы и деструкторы.
- •31. Интерфейс и система управления реализацией программного проекта.
- •36. Библиотеки, их организация и подключение.
- •37. Тестирование и оценка эффективности программ.
30. Инкапсуляция, наследование, полиморфизм. Конструкторы и деструкторы.
Кроме обычных процедур и функций Турбо-Паскаль реализует два специальных типа методов: конструктор и деструктор.
Конструктор - это специальный метод, инициализирующий объект, содержащий виртуальные методы, он объявляется специально зарезервированным словом constructor.
Синтаксис: constructor Init(< параметры >);
Конструктор инициализирует объект установлением связи между объектом и специальной таблицей виртуальных методов, содержащей адреса кодов, реализующих виртуальные методы. Конструктор может также использоваться для инициализации полей данных объекта.
Деструктор - это специальный метод, освобождающий память кучи от динамических объектов. Он объявляется с использованием специально зарезервированного слова destructor.
Синтаксис: destructor Done;
Основными отличительными свойствами объекта являются:
• инкапсуляция - объединение записей с процедурами и функциями, работающими с этими записями;
• наследование - задание объекта, затем использование его для построения иерархии порожденных объектов с наследованием доступа каждом из порожденных объектов к коду и данным предка;
• полиморфизм - задание одного имени действию, которое передается вверх и вниз по иерархии объектов, с реализацией этом действия способом, соответствующим каждому объекту в иерархии.
Рассмотрим смысл каждого из приведенных свойств.
Инкапсуляция
Допустим, наши практические интересы лежат в области построения изображений тел звездном неба в двумерной проекции. Очевидно, что основой всякого изображения является положение (позиция) отдельного элемента на экране, описываемая координатами Х и У. Для задания двумерной позиции подходит тип запись, имеющйся в Турбо- Паскале.
Position = Record
Х: Integer;
Y: Integer;
End;
Что можно делать с парой координат (Х,У) ?
Во-первых, может потребоваться задать значения координат (в программировании такая процедура носит название инициализации). Создадим соответствующую процедуру:
Procedure Init(СоordХ, СооrdУ: Integer);
Begin
Х:= СооrdX;
Y:= СооrdY.,
End;
Во-вторых, нам может потребоваться знание фактических значений координат, для этом вводим две функции:
Function GetX: integer;
Begin
GetX:= X;
End;
{---------------------------}
Function GetY: integer;
Begin
GetY:= Y;
End;
По нашему замыслу процедура Init и функции GetХ и GetY должны работать только с полями записи Pozition. Введение объектов в Паскаль позволяет зафиксировать зто положение, объявив и поля и действия в одном месте:
Pozition = Object
X: Integer;
Y: Integer,
Procedure Init(CoordX, CoordY: Integer);
Function GetX: Integer;
Function GetY: Integer;
End;
Теперь для инициализации экземпляра типа Pozition достаточно вызвать его метод, как если бы он был полем записи:
Var
FirstPozition: Pozition;
...................
Begin
FirstPozition.Init(10,15);
Метод задается так же, как и процедура в модуле: внутри объекта записывается заголовок (как в секции Interface модуля), при этом все поля, используемые методом, должны предшествовать ем объявлению. Определение метода (расшифровка действий) происходит вне объявления объекта. Имя метода должно предваряться названием типа объекта, которому метод принадлежит, сопровождаемым точкой.
Procedure Pozition.Init(CoordX, CoordY: Integer);
Begin
X:= CoordX;
Y:= CoordY;
End;
Заметим, что имена формальных параметров метода не могут совпадать с именами полей данных объекта.
Также как модуль защищает детали реализации процедур от пользователя, объект может защищать свои поля и методы. Для этом используется ключевое слово private (личный), Личные поля и методы доступны только внутри метода. Объявление выглядит следующим образом:
Type
ObjectNam = Object
поле;
..........
поле;
метод;
..........
метод;
private
ЧастноеПоле;
..........
ЧастноеПоле;
ЧастныйМетод;
..........
ЧастныйМеетод;
End;
Наследование
Рассмотрим звезду с координатами Х и У. Ее можно сделать видимой или невидимой, ей можно задать цвет, ее можно переместить.
Создадим объект с такими возможностями:
Star = Object
X: Integer;
Y: Integer;
Procedure Init(CoordX, CoordY: Integer);
Function GetX: Integer;
Function GetY: Integer;
Visible: Boolean;
Color: Word;
Procedure Init(CoordX, CoordY: Integer; InitColor: Word);
Function IsVisible: Boolean;
Procedure Show; { зажигает звезду }
Procedure Blind; { гасит звезду }
Procedure Jump(NextX, NextY: Integer); { перемещает звезду }
End;
Заметим, однако, что поля Х,У и методы GetХ, GetУ практически совпадают с соответствующими полями и методами обьекта Pozition. Турбо-Паскаль предоставляет возможность учесть эту ситуацию. Следует считать тип объекта Star порожденным типом Pozition, записав это следующим образом (наследование):
Star = Object(Pozition)
Visible: Boolean;
Color: Word;
Procedure Init(CoordX, CoordY: Integer; InitColor: Word);
Function IsVisible: Boolean;
Procedure Show;
Procedure Blind;
Procedure Jump(NextX, NextY: Integer);
End;
Объект Star теперь наследует свойства объекта Pozition. Поля Х,У явно не заданы в Star, но Star ими обладает благодаря наследованию, т.е. можно написать:
Star.X:=17;
Смысл обьектно-ориентированного программирования заключается именно в работе с полями объекта через его методы.
Полиморфизм
Давайте создадим объект "планета". Очевидно, что новый объект должен иметь предком объект Star, обладая всеми его свойствами, кроме того, быть "больше" по размеру (точнее - видимому размеру). Однако, даже начинающему программисту ясно, что нарисоавть на экране точку и закрашенную окружность не удастся одними и теми же командами.
Турбо-Паскаль разрешает сохранить потомку имя родительского метода, "перекрывая" его. Чтобы перекрыть родительский метод, нужно просто задать его с тем же именем, но с другим телом (кодом) и, если необходимо, с другим набором параметров. Такой метод делается виртуальным и к его объявлению добавляется слово virtual. Применение виртуальных методов налагает ограничения на процедуры инициализации, которые должны записываться с зарезервированным словом constructor и иметь общее имя Init.
Каждый отдельный экземпляр объекта должен инициализироваться с помощью отдельного вызова конструктора.
Для очистки и убирания динамически распределенных объектов существует специальная процедура - destructor Done.
Деструктор комбинирует шаг освобождения памяти в "куче" с некоторыми другими задачами. Метод деструктора может быть пустым, поскольку работу выполняет не только код тела, но и код, генерируемый Турбо-Паскалем в ответ на зарезервированное слово destructor.
