ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 01.04.2021

Просмотров: 593

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Отличие описания прототипа и определения конструктора от обычного метода 
состоит в том, что вместо ключевого слова procedure или function вы 
используйте ключевое слово Constructor.

Отличие описания прототипа и определения деструктора от обычного метода 
состоит в том, что вместо ключевого слова procedure или function вы 
используйте ключевое слово Destructor.

Создание объекта

Перед тем как создать объект его необходимо объявить. Объявляется объект так 
же как переменная с тем отличием, что вместо типа указывается имя класса. 
После объявления объекта необходимо вызвать конструктор.

Вызов конструктора и деструктора

Память под объекты, которые являются представителями класса, выделяется во 
время работы программы. Выделение памяти происходит автоматически при 
вызове конструктора.

Освобождение памяти происходит при вызове деструктора.

Формат вызова конструктора: объект:=класс.конструктор(список аргументов);

Деструктор вызывается как обычный метод.

Проверка объекта на принадлежность к классу

Чтобы проверить объекта на принадлежность к определенному классу 
используется бинарный оператор is.

В качестве первого аргумента он берет имя объекта, а вторым  аргументом 
является класс. Результатом работы этого оператора является логическое 
значение. Если объект объявлен, но не создан, то оператор возвращает False. На 
практике оператор is используется вместе с условным оператором if.

Свойства

Свойства позволяют ограничить доступ к членам. Ограничения задаются при 
помощи спецификаторов доступа. Спецификатор read дает права чтения. 
Спецификатор write дает права записи. Если спецификатор не задан, то по 
умолчанию даются  права на чтение.

Объявление свойства осуществляется следующим образом:

property имя:тип ограничитель;

Синтаксис задания ограничителя: спецификатор доступа:идентификатор

36


background image

Ограничитель может быть обычным и сдвоенный. Сдвоенный ограничитель 
задается как два ограничителя разделенные пробелом.

Идентификатор представляет собой имя члена, который привязывается к  
свойству. Идентификатор так же может быть именем метода, который работает 
с членом. Член или метод должны быть ранее объявлены в классе.

Доступ к члену осуществляется через имя свойство или метод.

Разновидности методов

Существуют несколько разновидностей методов. Вид метода определяется при 
помощи спецификатора. Вы можете явно задать разновидность метода при 
определении класса. Разновидность метода задается в его прототипе.

Синтаксис: прототип метода(список параметров); спецификатор;

Список спецификаторов дан в таблице ниже.

Спецификатор Описание
Virtual

Виртуальный метод.

Abstract

Абстрактные методы не имеют реализации и применяются в  
родительских классах

Dynamic

Синоним Virtual

Метод является обычным, если явно не указан его спецификатор.

Размещение классов в модулях

Классы можно размещать в модулях. При размещении класс внутри модуля 
запомните простые правила. Описание класса располагается в разделе описания 
модуля. Определения методов находятся в разделе реализации модуля.

Глава 3. Наследование

Простое наследование

Класс может порождаться от другого класса, который называется родительским. 
Как вы помните, этот процесс называется наследованием. Если класс имеет 
одного родителя, то наследование называют простым. При наследовании 
конструкция описывающая класс меняется.

37


background image

Описание класса при наследовании выглядит следующим образом:

Type имя=class(родительский класс);
Список элементов класса
end;

Множественное наследование

Если класс имеет нескольких родителей, то такое наследование называют 
множественным. При множественном наследовании имя родительского класса 
заменяется списком родителей, в котором имена классов разделены запятой.

Перезагрузка методов в производном классе

Перезагрузка методов аналогична перезагрузке подпрограмм.

Для того чтобы перезагрузить метод в производном классе вставьте его 
прототип в объявление производного класса.

Для перезагружаемых методов вы можете использовать модификатор overload, 
который введен для совместимости с Delphi.

Если производный класс с перезагружаемыми методами находиться в одном 
модуле с базовым классом, то использование модификатора overload не 
обязательно.

Отличия обычных и  виртуальных методов

Виртуальные методы часто применяются при перезагрузке методов. В основе 
работы виртуальных методов лежит механизм позднего связывания. Он прямо 
противоположен раннему связыванию. При раннем связывании привязка 
методов к объектам происходит на этапе компиляции программы.

Если применяется динамическое связывание, то привязка методов к объектам 
осуществляется во время работы программы при вызове конструктора. 
Виртуальный метод не может быть перекрыт обычным методом. Метод 
является обычным, если явно не указан спецификатор virtual или dynamic.

Перезагрузка виртуальных методов

Для того чтобы перезагрузить виртуальный метод в производном классе 
используйте в прототипе метода модификатор override.

При этом перегруженный метод так же будет виртуальным. Если вы хотите 
чтобы перегруженный метод являлся обычным методом, то используйте вместо 
модификатора override модификатор reintroduce.

38


background image

Глава 4. Вспомогательные классы

Расширение функционала

Вспомогательные классы позволяют расширить функционал существующего 
класса без необходимости создания производного. Вспомогательный класс не 
является полноценным и имеет ряд жестких ограничений. Ограничения 
вспомогательного класса:

1.

Запрещены конструкторы и деструкторы.

2.

Невозможно определить члены и свойства 

3.

Запрещены абстрактные методы.

4.

При перезагрузке виртуальных методов используется модификатор 
overload.

Создание вспомогательного класса

Синтаксис описания вспомогательного класса:

Type имя=class helper of класс;
прототипы методов;
End;

Определение методов аналогично определению в обычном классе.

Вызов методов

Поскольку назначение вспомогательного класса ограничиваться лишь 
расширением функциональности, есть одно отличие при  вызове методов 
вспомогательного класса. При вызове методов надо указывать имя объекта 
являющегося экземпляром того класса, который указан после ключевого слова 
of.

Глава 5. Ссылки на классы

Что такое ссылка на класс?

В диалекте Free Pascal есть специальный тип данных, называемый ссылкой на 
класс. Переменным этого типа можно присваивать родительский класс и 
производные от него классы.

Использование ссылок на классы в Free Pascal

 Синтаксис описания ссылки на класс:

Type имя ссылки на класс=class of имя класса;

39


background image

Объявление переменной делается обычным образом,  но вместо встроенного 
типа указывается ссылка на класс. Этой переменной можно присвоить класс и 
все производные от него классы.

Глава 6. Интерфейсы

Поддержка интерфейсов

Free Pascal поддерживает интерфейсы. Они необходимы если вы хотите 
использовать объекты, которые находятся в бинарных файлах. Примером такого 
файла является динамически подключаемая библиотека.

Интерфейс, так же как и класс описывает объект с тем отличием, что он не 
содержит реализации методов. Интерфейс содержит только прототипы.

Реализация интерфейсов

Интерфейс реализуется при помощи класса. Его объявление должно идти сразу 
после описания интерфейса. В определении класса описание элементов должно 
совпадать с их описанием в интерфейсе. Для реализации интерфейса нужно два 
родительских класса.

В качестве первого родителя используйте класс TinterfacedObject. Имя 
интерфейса используйте как второго родителя.

Отличия от классов

Отличия интерфейса от класса состоят в следующем:

1.

Интерфейсы можно использовать, только если переключить компилятор в 
режим совместимости с Delphi или Object Pascal.

2.

Нельзя использовать спецификаторы доступа. Все члены и методы 
интерфейса доступны публично.

3.

Конструкторы и деструкторы не используются. Интерфейс не 
предназначен для непосредственного создания.

4.

Спецификаторы, определяющие разновидности методов, так же не 
используются.

Описание интерфейса

Интерфейс описывается при помощи следующей конструкции:

Type имя=Interface
список элементов
End;

40