Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник Pascal ABC.doc
Скачиваний:
67
Добавлен:
07.11.2018
Размер:
985.6 Кб
Скачать

Обзор классов и объектов

Класс представляет собой составной тип, состоящий из полей (переменных), методов (процедур и функций) и свойств.

Описание класса имеет вид:

type   имя класса=class     описания полей           объявления или описания методов и описания свойств   end;

После слова class в скобках может быть указано имя класса-предка (см. п. Наследование).

Поля описываются по тем же правилам, что и поля в записях (см. п. Записи). Поля и методы образуют интерфейс класса.

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

Например:

type   Student=class     name: string;     course, group: integer;     constructor Create(nm: string; c,gr: integer);     procedure Print;     begin       writeln('Имя:',name,' курс:',course,' группа:');     end;     procedure NextCourse;     begin       Inc(course);     end;   end;

  constructor Student.Create(nm: string; c,gr: integer);   begin     name:=nm;     course:=c;     group:=g;   end;

Здесь конструктор Create объявлен в классе, а определен вне класса, а методы Print и NextCourse определены внутри класса. При определении метода вне класса его имя предваряется именем класса с последующей точкой.

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

Объявление метода не может следовать за определением этого же метода.

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

var s: Student; ... s.name:='Иванов'; s.course:=1; s.group:=3; s.Print; s.GotoNextCourse; s.Print;

Как и другие указатели, переменная типа класс может хранить значение nil:

s:=nil; ... if s=nil then ...

Несколько переменных типа класс могут ссылаться на один объект:

var s1,s2: Student; ... s1.name:=' Петров'; s2:=s1; writeln(s2.name); // s2.name='Петров'

Локальные определения классов (т.е. определения в процедурах и функциях) запрещены.

В методах, описанных внутри класса запрещены вложенные описания подпрограмм.

Конструкторы и деструкторы

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

Конструктор представляет собой функцию, создающую объект в динамической памяти, инициализирующую его поля и возвращающую указатель на созданный объект. Этот указатель обычно сразу присваивается переменной типа класс. При описании конструктора вместо служебного слова function используется служебное слово constructor. Кроме того, для конструктора не указывается тип возвращаемого значения. Для вызова конструктора следует указать имя класса, за которым следует точка-разделитель, имя конструктора и список параметров. Например:

var s: Student; ... s:=Student.Create('Иванов',1,3);

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

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

s.Destroy;

После вызова деструктора пользоваться объектом (т.е. обращаться к его полям и вызывать его методы) нельзя. Чтобы это подчеркнуть, полезно сразу после вызова деструктора присвоить переменной, представляющей объект, значение nil:

s:=nil;

В Pascal ABC, как и в Borland Delphi, принято использовать имя Create для конструктора и имя Destroy - для деструктора.

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