Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекция. Объектная модель языка Free Pascal

.pdf
Скачиваний:
36
Добавлен:
18.03.2015
Размер:
494.13 Кб
Скачать

1Лекция 2. Объектная модель языка Free Pascal/Lazarus.

1.Основные понятия

Следующим шагом в развитии технологий программирования было появление объектно-ориентированного программирования. Здесь программный код перестал быть "плоским" и программист оперирует не просто процедурами и функциями, а целыми объектами.

Объект — совокупность свойств, методов, событий. Это значит, что объект как бы состоит из методов, свойств и событий, и они обеспечивают его полноценную работу. Представим себе Кнопку. Она обладает:

Именем (например «Кнопка 1»)

свойствами (цвет, текст на кнопке, шрифт текста и т. д.);

событиями (события пользовательского ввода, например,

нажатие на кнопку);

методами (обеспечивающими работу кнопки, например, метод прорисовки текста, прорисовки фокуса и т. д.).

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

Свойства или состояние — это переменные, которые влияют на состояние объекта. Например, ширина, высота.

Методы — это те же процедуры и функции, т. е. это то, что объект умеет делать (вычислять). Например, объект может иметь процедуру для вывода какого-то текста па экран. Эта процедура и есть метод, который принадлежит объекту.

События — это те же процедуры и функции, которые вызываются при наступлении определенного события. Например, если изменилось какое-то свойство объекта, может быть сгенерировано соответствующее событие и вызвана процедура, которая инициализирует реакцию приложения на это событие.

1

2 Лекция 2. Объектная модель языка Free Pascal/Lazarus.

Для работы с объектами во FreePascal введено понятие класса.

Класс – это сложная структура, включающая, помимо описания данных, описание процедур и функций, которые могут быть выполнены над представителем класса – объектом.

Классом называется составной тип данных, членами (элементами) которого являются функции и переменные (поля). В основу понятия «класс» положен тот факт, что "над объектами можно совершать различные операции". Свойства объектов описываются с помощью переменных (полей) классов, а действия над объектами описываются с помощью подпрограмм, которые называются «методами класса». Объекты называются экземплярами класса.

Объектно-ориентированное программирование (ООП) – представляет собой технологию разработки программ с использованием объектов.

В объектно-ориентированных языках есть три основных понятия: инкапсуляция, наследование и полиморфизм. Инкапсуляцией называется объединение в классе данных и подпрограмм для их обработки. Наследование – это когда любой класс может быть порождён другим классом. Порождённый класс (наследник) автоматически наследует все поля, методы, свойства и события. Полиморфизм позволяет использовать одинаковые имена для методов, входящих в различные классы.

Все классы, используемые в Lazarus (уже определенные в библиотеках классов и создаваемые разработчиком для конкретного приложения),

наследуются от класса TObject, который содержит ряд специальных методов,

существенно снижающих сложность программирования.

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

type

<имя объявляемого класса>=class(<имя родителя>)

<методы и переменные класса>

2

3 Лекция 2. Объектная модель языка Free Pascal/Lazarus.

private

<скрытые элементы класса, доступные только в пределах модуля>

protected

<защищенные элементы класса, доступные только в классах потомках>

public

<общедоступные элементы класса, доступные из других модулей>

published

<опубликованные элементы класса, видимые в Инспекторе объектов>

end;

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

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

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

Для всех идентификаторов (полей, методов или свойств), объявленных внутри класса, накладывается определенная область видимости, распространяющаяся

от точки объявления до конца описания класса;

3

4Лекция 2. Объектная модель языка Free Pascal/Lazarus.

во всех объектах объявляемого класса, расположенных как в данном модуле, так и в модулях, которые его включают в своем предложении uses;

во всех классах-потомках объявляемого класса и их объектах, расположенных как в данном модуле, так и в модулях, которые его включают в своем предложении uses;

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

Дополнительно область видимости идентификаторов в классах может ограничиваться правилами области видимости в блоках, а также специальными директивами управления областью видимости published, public, protected, private и automated.

Директива public

Поля, свойства и методы, описанные в разделе public, называются общедоступными или публичными. Их область видимости подчиняется рассмотренным правилам общего случая.

Директива published

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

Такие свойства могут быть только у ограниченного числа типов:

порядковых, вещественных, за исключением Real, типа String, типа

«множество» с максимальным числом элементов не более 15.

Директива automated

4

5 Лекция 2. Объектная модель языка Free Pascal/Lazarus.

Поля, свойства и методы, описанные в разделе automated, назовем по имени директивы, автоматическими. Их область видимости эквивалентна области видимости общедоступных описаний. Отличие состоит в том, что для автоматических свойств и методов генерируется дополнительная информация, которая используется для реализации OLE-механизма.

Директива private

Поля, свойства и методы, описанные в разделе private, называются приватными или личными. Их область видимости ограничивается пределами того модуля, в котором они описаны и где они доступны так же, как и public-

описания. Раздел private в рамках объявления класса играет роль,

аналогичную роли раздела реализации модуля implementation, то есть скрытие информации разработчика, о которой не должен знать пользователь,

включающий созданный модуль в предложении uses.

Директива protected

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

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

Потомки класса могут менять область доступности всех элементов родительского класса, кроме элементов, объявленных в секции private, так как последние им не доступны.

Во FreePascal класс (объект) – это динамическая структура. В отличие от статической она содержит не сами данные, а ссылку на них. Поэтому программист должен сам позаботиться о выделении памяти для этих данных.

5

6 Лекция 2. Объектная модель языка Free Pascal/Lazarus.

Выделение и освобождение данных происходит с помощью специальных методов.

Конструктор — это специальный метод, создающий и инициализирующий объект. Объявление конструктора имеет вид:

constructor Create;

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

constructor имя_класса.Create; begin

поле1:=выражение1;

поле2:=выражение2;

...

inherited Create; end;

В результате работы конструктора инициализируются все поля класса, при этом порядковым типам в качестве начальных значений задается 0, а строки задаются пустыми.

Деструктор – это специальный метод, уничтожающий объект и освобождающий занимаемую им память. Объявляется деструктор следующим образом:

destructor Destroy;

Особенности работы с объектами представлены в таблице:

6

7 Лекция 2. Объектная модель языка Free Pascal/Lazarus.

На первом шаге в соответствии с описанием создаются переменные А и В.

При создании они обнуляются, т.е. в них записывается значение nil. На втором шаге выполнено конструирование объекта А. Теперь указатель А содержит адрес этого объекта. На третьем шаге выполняется операция присваивания над объектами, в результате которой указатель В теперь также содержит адрес того же объекта. На четвертом шаге уничтожается объект В. Теперь и А и В указывают на уже освобожденное поле памяти, которое может использоваться системой для других целей. Попытка повторного освобождения того же участка памяти с использованием любого указателя приведет к возникновению ошибки адресации. Попытка обращения к полю или методу объекта с использованием этих указателей также приведет к возникновению ошибки адресации.

7

8Лекция 2. Объектная модель языка Free Pascal/Lazarus.

2.объявление класса в Lazarus

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

Круг. В соответствии с правилами Lazarus он наследуется от класса TObject.

При этом добавляем поля для хранения координат центра окружности (x, y),

ее радиуса r, цвета Color. Набор методов определится перечнем сообщений на которые должен в основном реагировать объект данного класса. Дополнительно определим метод Crete, чтобы использовать его для инициализации полей объекта при создании. Кроме этого, целесообразно определить метод Clear для стирания нарисованной окружности при изменении ее размера или цвета.

Определим тип доступа для всех компонентов класса: все поля и метод

Clear, к которому не требуется доступ извне, объявим в секции private

(внутренние), а все остальные компоненты - в секции public.

Unit Circul;

Interface

Type

TMyCircle=class

private

X, y, r: Word; {координаты центра и радиус окружности} Color: TColor; {цвет}

Procedure Clear; {стирание окружности}

public

Constructor Create (ax,ay,ar: Word; aColor:TColor);

{конструктор}

Procedure Draw; {рисование}

8

9 Лекция 2. Объектная модель языка Free Pascal/Lazarus.

Procedure ReSize(ar: Word); {изменение размеров}

Procedure ReColor(acolor: TColor); {изменение цвета} end;

//объявление идентификатора класса

Var

MyCircle: TMyCircle;

Implementation

Constructor TMyCircle.Create;

Begin

inherited Create; {вызвать наследуемый конструктор} x:=ax; у:-ay; r:=ar; Color: =aColor;

End;

Procedure TMyCircle.Draw;

Begin

End;

Procedure TMyCircle. Clear;

Begin

End;

Procedure TMyCircle.ReSize;

Begin

End;

9

10 Лекция 2. Объектная модель языка Free Pascal/Lazarus.

Procedure TMyCircul.ReColor(aColor: TColor);

Begin

End;

End.

Далее необходимо программировать обработчики событий, при наступлении которых должны выполняться основные операции приложения.

Для использования объекта Круг его необходимо создать, для этого в программе необходимо выполнить следующую команду:

<Идентификатор объекта>:=<Идентификатор типа>.Create

В нашем случае:

MyCircle:= TMyCircle.Create

Для обращения к полю объекта необходимо вызвать в любой точке программы:

<Идентификатор объекта>.<Наименование поля>

В нашем случае:

MyCircle.x:=25;

MyCircle.Color:=clGreen

Для вызова метода необходимо выполнить следующую команду

<Идентификатор объекта>.<Наименование метода>

В нашем случае:

MyCircle.ReSize

3. Наследование и полиморфизм

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

10