Тело класса делится на секции. В начале каждой секции располагается модификатор доступа, после которого идут поля, а затем методы и свойства с доступом, определяемым этим модификатором. В первой секции модификатор доступа может отсутствовать, в этом случае подразумевается модификатор internal. В классе может быть произвольное количество секций, располагающихся в произвольном порядке.
Например, пусть данный код располагается в одном модуле:
type
A = class
private
x: integer;
protected
a: integer;
public
constructor Create(xx: integer)
begin
x := xx; // верно, т.к. внутри метода класса можно обращаться к его закрытому полю x
a := 0; // верно
end;
;
Следующий же код пусть располагается в другом модуле: type
B = class(A)
public
procedure print;
begin
writeln(a); // верно, т.к. a - защищенное поле
writeln(x); // неверно, т.к. х - закрытое поле
end;
end;
...
var b1: B := new B(5);
...
writeln(b1.x); // неверно, т.к. х - закрытое поле
writeln(b1.a); // неверно, т.к. a - защищенное поле
b1.print; // верно, т.к. print - открытый метод
Комментарии по тексту программы описывают верное и неверное в смысле доступа обращение к полям и методам.
Методы
Методы представляют собой процедуры и функции, объявленные внутри класса или записи. Особыми разновидностями методов являются конструкторы, деструкторы и перегруженные операции.
Определение методов можно давать как внутри класса (стиль Java, C#, C++), так и вне класса (стиль Delphi, C++). При определении метода вне интерфейса класса его имя предваряется именем класса с последующей точкой. Например:
type
Rectangle = class
x1,y1,x2,y2: integer;
constructor Create(xx1,yy1,xx2,yy2: integer);
begin
x1 := xx1; x2 := xx2;
y1 := yy1; y2 := yy2;
end;
function Square: integer;
end;
function Rectangle.Square: integer;
begin
Result := abs(x2-x1) * abs(y2-y1);
end;
Обычно когда класс определяется в интерфейсной части модуля, то в интерфейсе класса производят лишь объявление методов, реализацию же методов класса дают в секции реализации модуля.
Методы делятся на
Внутри классового метода не может быть обращения к полям класса, а может быть только обращение к другим классовым методам. Напротив, экземплярный метод может вызывать классовый.
Например:
type
Rectangle = class
...
class procedure Move(var r: Rectangle; dx,dy: integer);
begin
r.x1 += dx; r.x2 += dx;
r.y1 += dy; r.y2 += dy;
end;
end;
...
var r := new Rectangle(10,10,100,100);
Rectangle.Move(r,5,5);
По существу, классовые методы являются разновидностью глобальных подпрограмм, но находятся внутри класса, что подчеркивает, что они осуществляют действия, связанные именно с этим классом. Класс в этом случае выступает только в роли пространства имен.
Нередко создаются классы, целиком состоящие из классовых методов. Таков, например, класс System.Math, содержащий определения математических подпрограмм.
Инициализаторы полей
При создании объекта
Например:
type
A = class
private
x: integer := 1;
y: integer;
l := new List
public
constructor Create(xx,yy: integer);
begin
x := xx;
y := yy;
end;
constructor Create;
begin
end;
end;