Класс представляет собой составной тип, состоящий из полей (переменных), методов (процедур и функций) и свойств. Переменные типа класс называются объектами или экземплярами класса.
Описание класса имеет вид:
type
имя класса= class
описания полей
объявления или описания методов и описания свойств
end;
После слова class
в скобках может быть указано имя класса-предка (см.
Наследование), а также через запятую список поддерживаемых
интерфейсов.
Перед словом class
может быть указано ключевое слово final – в
этом случае от класса запрещено наследовать.
Все описания и объявления внутри класса образуют тело класса. Поля описываются по тем же правилам, что и поля в записях (см. Записи). Инициализаторы полей описаны здесь. Поля и методы образуют интерфейс класса.
В отличие от Object Pascal, тела методов могут описываться как внутри, так и вне класса. Описание методов идентично описанию обычных подпрограмм. Объявление метода является заголовком подпрограммы, которая должна быть описана либо внутри, либо позднее вне тела класса. При описании вне класса имя метода должно предваряться именем класса с последующей точкой.
Например:
type
Person = class
private
nm: string;
ag: integer;
public
constructor Create(name: string; age: integer);
procedure Print;
begin
writeln('Имя: ',nm,' Возраст: ',ag);
end;
procedure NextYear;
begin
Inc(ag);
end;
end;
constructor Person.Create(name: string; age: integer);
begin
nm := name;
ag := age;
end;
Здесь конструктор Create
объявлен в классе, а определен вне класса, а методы Print
и NextYear определены внутри класса. При
определении метода вне класса его имя предваряется именем класса с последующей
точкой. При определении метода внутри класса он не должен
содержать вложенные описания подпрограмм ввиду синтаксической неоднозначности. Объявление метода не может следовать за определением этого же метода
в теле класса.
Обычно только небольшие методы определяются внутри класса. Это делается для того чтобы интерфейс класса был обозримым.
Каждый объект содержит копии всех полей, определенных в его классе, и может пользоваться всеми его методами.
В языке Object Pascal реализована ссылочная модель объектов. Это значит, что переменная типа класс хранит в действительности указатель на объект. Однако, при обращении к полям, методам или свойствам объекта разыменование такого указателя не требуется; указывается имя объекта и затем, после разделителя-точки, указывается имя поля, метода или свойства:
var p: Person := new Person('Иванов',20);
p.Print;
p.NextYear;
p.Print;
Как и другие указатели, переменная типа класс может хранить значение
nil:
p := nil;
...
if p = nil then ...
Несколько переменных типа класс могут ссылаться на один объект и совместно модифицировать его:
var p1,p2: Person;
...
p1 := new Person('Петров',20);
p2 := p1;
p1.IncAge;
p2.Print; // Имя: Петров Возраст: 21
Локальные определения классов (т.е. определения в процедурах
и функциях) запрещены.