Класс или объект – это структура данных, которая содержит поля и методы. Как всякая структура данных она начинается зарезервированным словом и закрывается оператором end. Формальный синтаксис не сложен: описание объектного типа получается, если в описании записи заменить слово record на слово object или class и добавить объявление функций и процедур, действующих в данном объекте.
Type <имя типа объекта>= object
<поле>;
<поле>;
….
<метод>;
<метод>;
end;
В ObjectPascal существует специальное зарезервированное слово class для описания объектов, заимствованное из С++.
Type <имя типа объекта>= class
<поле>;
….
<метод>;
<метод>;
end;
ObjectPascal поддерживает обе модели описания объектов.
Компонент объекта – либо поле, либо метод. Поле содержит имя и тип данных. Метод – это процедура или функция, объявленная внутри декларации объектного типа, в том числе и особые процедуры, создающие и уничтожающие объекты (конструкторы и деструкторы). Объявление метода внутри описания объектного типа состоит только из заголовка. Это разновидность предварительного описания подпрограммы. Тело метода приводится вслед за объявлением объектного типа.
|
|
Директивы private, protected, public. Перечисленные директивы предназначены для ограничения доступа к элементам класса. Использование директив при описании класса необязательно.
Секция private содержит внутренние элементы, обращение к которым возможно только в пределах модуля, содержащего описание класса.
Секция protected содержит защищенные элементы, которые доступны в пределах модуля, содержащего определение класса, и внутри классов- потомков.
Секция public содержит общедоступные элементы, к которым возможно обращение из любой части программы.
В общем виде описание нового класса имеет следующий синтаксис:
Type <имя типа объекта>= class
Private
<скрытые_элементы_класса>
Protected
<защищенные_элементы_класса>
Public
<общедоступные_элементы_класса>
End;
После того, как описаны типы данных – классы – в разделе описания переменных необходимо описать экземпляры этих классов (т.е. переменные описанных типов – объекты). В программе обращение к экземплярам класса осуществляется по имени (как к обычным переменным) с указанием либо поля, к которому происходит обращение, либо метода, вызов которого производится:
<имя_объекта>.<имя_поля>
<имя_объекта>.<имя_метода>
Пример. Вводится объектный тип «предок», который имеет поле данных Name (имя) и может выполнять два действия:
· провозглашать: «Я – предок!»;
· сообщать свое имя.
Type tPredoc = object
Name: string; {поле данных объекта}
Procedure Declaration; {объявление методов}
|
|
Procedure MyName; {объекта}
End;
Тексты подпрограмм, реализующих методы объекта, должны приводиться в разделе описания процедур и функций. Заголовки при описании реализации метода повторяют заголовки, приведенные в описании типа, но дополняются именем объекта, которое отделяется от имени процедуры точкой. В нашем примере:
Procedure tPredoc. Declaration; {реализация метода объекта}
begin
writeln(‘Я – предок!’);
end;
Procedure tPredoc. MyName; {реализация метода объекта}
begin
writeln(‘Я – ’, Name);
end;
Внутри описания методов на поля и методы данного типа ссылаются просто по имени. Так метод MyName использует поле Name без явного указания его принадлежности объекту так, если бы выполнялся неявный оператор with <переменная_типа_объект> do.
Под объектами понимают и переменные объектного типа – их называют экземплярами. Как всякая переменная, экземпляр имеет имя и тип: их надо объявить.
…….{объявление объектного типа и описание его методов}
var v1: tPredoc; {объявление экземпляра объекта}
begin
v1.Name:= ‘Петров Николай Иванович’;
v1.Declaration;
v1.MyName
end.
Использование поля данных объекта v1 не отличается по своему синтаксису от использования полей записей. Вызов методов экземпляра объекта означает, что указанный метод вызывается с данными объекта v1. В результате на экран будут выведены строчки
Я – предок!
Я – Петров Николай Иванович
Аналогично записям, к полям переменных объектного типа разрешается обращаться как с помощью уточненных идентификаторов, так и с помощью оператора with.
Например, в тексте программы вместо операторов
v1.Name:= ‘Петров Николай Иванович’;
v1.Declaration;
v1.MyName
возможно использование оператора with такого вида
with v1 do
begin
Name:= ‘Петров Николай Иванович’;
Declaration;
MyName
End;
Более того, применение оператора with с объектными типами, также как и для записей не только возможно, но и рекомендуется.