Содержание | Тип <объект> | Основные свойства объектов | Инкапсуляция | Наследование | Полиморфизм | ||||
ТурбоПаскаль и объектно-ориентированное программирование 1. Основные определения типа <объект> Начиная с версии 5.5, Турбо-Паскаль охватывает еще один современный метод проектирования программ, описанный выше как обьектно-ориентированное проектирование. Объект - это структура данных, содержащая поля данных (подобно записи) различных типов и заголовки методов. Синтаксис объявления объекта: Объявление метода внутри объявления объектного типа содержит только заголовок. Тело метода определяется вне объявления объекта. Его заголовок должен содержать имя объекта, которому принадлежит метод. Например: Методы подразделяются на статические и виртуальные. Виртуальный метод отличается от статического тем, что реализующий его код подсоединяется к вызову не в процессе компиляции, а в процессе выполнения, что достигается так называемым поздним связыванием. Это дает возможность строить иерархию объектов с одинаковыми названиями методов, реализуемыми, однако, различными кодами. Синаксис объявления виртуального метода: Procedure Метод(< параметры >); virtual; Кроме обычных процедур и функций Турбо-Паскаль 6.0 реализует два специальных типа методов: конструктор и деструктор. Конструктор - это специальный
метод, инициализирующий объект, содержащий виртуальные методы, он
объявляется специально зарезервированным словом constructor. Деструктор - это специальный
метод, освобождающий память кучи от динамических объектов. Он объявляется
с использованием специально зарезервированного слова destructor. Основными отличительными свойствами
объекта являются: Рассмотрим смысл каждого из приведенных свойств.
Инкапсуляция Position = Record Procedure Init(СоordХ, СооrdУ:
Integer); Во-вторых, нам может потребоваться знание фактических значений координат, для этом вводим две функции: Function GetX: integer; По нашему замыслу процедура Init и функции GetХ и GetY должны работать только с полями записи Pozition. Введение объектов в Паскаль позволяет зафиксировать зто положение, объявив и поля и действия в одном месте: Pozition = Object Теперь для инициализации экземпляра типа Pozition достаточно вызвать его метод, как если бы он был полем записи: Var Метод задается так же, как и
процедура в модуле: внутри объекта записывается заголовок (как в секции
Interface модуля), при этом все поля, используемые методом, должны
предшествовать ем объявлению. Определение метода (расшифровка действий)
происходит вне объявления объекта. Имя метода должно предваряться
названием типа объекта, которому метод принадлежит, сопровождаемым точкой.
Заметим, что имена формальных параметров метода не могут совпадать с именами полей данных объекта. Также как модуль защищает детали
реализации процедур от пользователя, объект может защищать свои поля и
методы. Для этом используется ключевое слово private (личный), Личные поля
и методы доступны только внутри метода. Объявление выглядит следующим
образом:
Наследование Star = Object Заметим, однако, что поля Х,У и методы GetХ, GetУ практически совпадают с соответствующими полями и методами обьекта Pozition. Турбо-Паскаль предоставляет возможность учесть эту ситуацию. Следует считать тип объекта Star порожденным типом Pozition, записав это следующим образом (наследование): Star = Object(Pozition) Объект Star теперь наследует свойства
объекта Pozition. Поля Х,У явно не заданы в Star, но Star ими обладает
благодаря наследованию, т.е. можно написать: Смысл обьектно-ориентированного программирования заключается именно в работе с полями объекта через его методы.
Полиморфизм Турбо-Паскаль разрешает сохранить потомку имя родительского метода, "перекрывая" его. Чтобы перекрыть родительский метод, нужно просто задать его с тем же именем, но с другим телом (кодом) и, если необходимо, с другим набором параметров. Такой метод делается виртуальным и к его объявлению добавляется слово virtual. Применение виртуальных методов налагает ограничения на процедуры инициализации, которые должны записываться с зарезервированным словом constructor и иметь общее имя Init. Каждый отдельный экземпляр объекта должен инициализироваться с помощью отдельного вызова конструктора. Для очистки и убирания динамически распределенных объектов существует специальная процедура - destructor Done. Деструктор комбинирует шаг освобождения памяти в "куче" с некоторыми другими задачами. Метод деструктора может быть пустым, поскольку работу выполняет не только код тела, но и код, генерируемый Турбо-Паскалем в ответ на зарезервированное слово destructor. |
|||||||||