ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 01.04.2021
Просмотров: 588
Скачиваний: 3
Идентификатор интерфейса
Приведенная ниже информация специфична для Windows и не актуальна для
других систем.
В Windows для того чтобы без ограничений пользоваться объектами, которые
описывает интерфейс, он должен иметь идентификатор.
Идентификатор представляет собой 128 битное число. Такие идентификаторы
обозначают термином GUID.
GUID определяется при помощи следующей конструкции:
const имя:TGUID='значение';
Определение GUID находиться в разделе описаний модуля или программы.
Часть 4. Концепция объектов вне классов
Глава 1. Объекты без классов
Объекты сами по себе
Free Pascal позволяет определить объекты, у которых нет классов. По сути,
объект без класса является модификацией записи. Существует два больших
различия между классами и объектами без класса.
Память под объект без класса выделяется из стека. Память под класс
выделяется из кучи. При использовании классов обязательно вызывать
конструктор, который производит инициализацию объекта принадлежащего
классу. Так же не следует забывать вызывать деструктор по окончанию
использования класса.
В случае использования объектов без классов применение конструктора и
деструктора необходимо только при присутствии в объекте виртуальных
методов.
Спецификаторы доступа
Спецификатор
Описание
Private
Объект доступен только в своем модуле
Protected
Объект доступен в своем модуле и в других модулях, которые на
него ссылаются
Public
Объект доступен везде
41
Описание объекта
Синтаксис описания объекта:
Type имя=object
Список элементов
End;
Описание объекта дается в разделе объявлений перед объявлением
используемых в программе переменных и констант.
Определение методов
Определения методов в объектах без класса, похоже на определение методов
классовых объектов. Но вместо имени класса используется имя объекта.
Определения методов даются за пределами описания объекта в разделе
определений перед определением используемых подпрограмм.
Размещение объектов в модулях
Правила аналогичны размещению классов в модулях.
Объявление экземпляра объекта и манипуляции с ним
Вначале нужно объявить экземпляр, а затем вызвать конструктор.
Обь явление экземпляра осуществляться при помощи следующей конструкции:
var экземпляр:объект;
Вызов методов и обращение к данным членам делается аналогично объектам
использующим классы, но вместо имени объекта используется имя экземпляра.
Конструктор и деструктор вызывается как обычный метод.
Статистические поля
Статистические члены похожи на глобальные переменные доступные только
внутри объекта. Объявление членов находиться в списке элементов. Чтобы
объявить член как статистический используйте спецификатор static. Формат
задания спецификаторов членов аналогичен формату задания спецификаторов
методов.
Оператор with
Обычно когда вы вызываете методы или обращаетесь к членам объекта то
используйте конструкцию вида объект.обращение; для объектов являющимися
представителями класса или экземпляр.обращение; для объектов без классов.
42
Оператор with позволяет более удобно манипулировать объектами.
Синтаксис:
with объект do
begin
код, манипулирующий объектом
end;
В качестве объекта может выступать представитель класса или обычный объект.
Так же оператор with позволяет манипулировать экземпляром записи.
Полиморфизм в объектах
Объекты без классов также поддерживают наследование. Родительские объекты
задаются при определении объекта. Задание родительских объектов
аналогично заданию родительских классов.
Соответственно в объектах
доступна перезагрузка и использование виртуальных методов.
Для объектов без
классов в прототипе перезагружаемых методов указывается спецификатор
virtual.
Вызов методов производного объекта в родительском объекте
Для того чтобы вызвать метод производного объекта в экземпляре
родительского необходимо использовать оператор as. Он приводит тип
экземпляра родительского объекта к типу производного.
Синтаксис: объект1 as объект2.
Если объект2 не является производным от объект1, то выбрасывается
исключение. Практически оператор as применяется в связке с оператором with.
Оператор as так же применим к представителям класса.
Глава 2. Динамические объекты
Особенности динамических объектов
По умолчанию память под объекты без класса не распределяется динамически.
Она выделяется при запуске программы и освобождается перед ее
завершением. Это влечет за собой большее потребление памяти. Часто
потребление памяти является важным фактором. Поэтому Free Pascal
предоставляет возможность ручного создания и работы с динамическими
объектами. Для динамических объектов необходимо наличие конструктора и
деструктора.
Опытный программист заметит схожесть механизма работы с динамическими
объектами между диалектами Free Pascal и Turbo Pascal.
43
Создание объектов
Перед созданием объекта нужно объявить указатель на объект. Он объявляется
так же как обычный, но вместо встроенного типа используется имя объекта.
Создание объекта происходит при выделении памяти для него. Память
выделяется при помощи подпрограммы New.
Делается это двумя способами. Рассмотрим их оба.
Первый способ заключается в передачи подпрограмме New указателя в качестве
аргумента. Затем нужно вызвать конструктор.
Формат вызова конструктора: указатель^.конструктор(параметры);
При использовании второго способа конструктор вызывается автоматически.
При этом меняется формат вызова подпрограммы New.
Первая форма вызова подпрограммы New: New(указатель,конструктор);
Вторая форма вызова подпрограммы New: указатель:=New(объект,конструктор);
Удаление объектов
Объект удаляется при помощи подпрограммы Dispose.
Формат вызова: Dispose(указатель, деструктор);
Подпрограмма Dispose автоматически вызывает деструктор.
Работа с объектами
Синтаксис обращения к членам и вызов методов немного меняется, если объект
является динамическим.
Обращение к члену объекта: указатель^.член;
Вызов метода: указатель^.метод(аргументы);
Особенности создания и удаления объектов
Конструктор не должен иметь список параметров при использовании второго
способа вызова подпрограммы New. Кроме того в качестве второго аргумента
передается только имя конструктора. Аналогичные правила действуют при
передаче деструктора в подпрограмму Dispose.
Поясним все вышеизложенное на примере.
Предположим, существует объект test и указатель на него point. Объект test
имеет конструктор setup и деструктор kill.
Примеры правильного создания объекта:
New(point,setup); и point:=New(test,setup);
44
Примеры неправильного создания объекта:
New(point,point^.setup); и point:=New(test,point^.setup);
Пример правильного удаления объекта:
Dispose(point,kill);
Пример неправильного удаления объекта:
Dispose(point,point^.kill);
Глава 3. Расширенные записи
Отличия расширенной записи от объекта без класса
Free Pascal поддерживает расширенные записи. Они нужны для совместимости
с Delphi 2006 и выше. Вы можете использовать их в своем коде, только если
переключите компилятор в режим совместимости с Delphi. Расширенные
записи похожи на объекты без класса, но имеют ряд отличий.
Отличия расширенной записи от объекта без класса:
1. Не поддерживается наследование
2. Запрещен спецификатор published
3. Конструкторы и деструкторы не используются
4. Запрещены абстрактные и виртуальные методы
Описание расширенной записи
Синтаксис описания расширенной записи:
Type имя=extended record
Список элементов
End;
Вспомогательные расширенные записи
Вспомогательные расширенные записи применяются для расширения
функционала расширенных записей. Вспомогательные расширенные записи
похожи по предназначению на вспомогательные классы, но имеют ряд
ограничений. Эти ограничения обусловлены спецификой расширенных записей.
Ограничения вспомогательных расширенных записей:
1. Не могут быть заменой вспомогательных классов
2. Доступны только в режиме совместимости с Delphi
3. Вы можете обращаться только к публичным членам расширенной записи
45