Например:
type
A = class
private
x: integer := 1;
y: integer;
l := new List;
public
constructorCreate(xx,yy: integer);
begin
x := xx;
y := yy;
end;
constructorCreate;
begin
end;
end;
В данном примере код x:=1; l := new List вставляется в начало каждого конструктора.
Объекты создаются с помощью специальных методов, называемых конструкторами .
Конструктор представляет собой функцию, создающую объект в динамической памяти, инициализирующую его поля и возвращающую указатель на созданный объект. Этот указатель обычно сразу присваивается переменной типа класс. При описании конструктора вместо служебного слова functionиспользуется служебное слово constructor. Кроме того, для конструктора не указывается тип возвращаемого значения.
Например:
type
Person = class
private
nm: string;
ag: integer;
public
constructorCreate(name: string; age: integer);
end;
...
constructorPerson.Create(name: string; age: integer);
begin
nm := name;
ag := age;
end;
В PascalABC.NETконструктор всегда должен иметь имя Create. При описании конструктора внутри класса можно опускать его имя:
type
Person = class
constructor(name: string; age: integer);
begin
nm := name;
ag := age;
end;
end;
В силу особенностей реализации вызовов конструкторов в .NET в PascalABC.NETвсегда создается конструктор без параметров (независимо от того, определен ли другой конструктор). Этот конструктор инициализирует все поля нулевыми значениями (строковые поля - пустыми строками, логические - значением False).
Для вызова конструктора можно использовать два способа.
1 способ.В стиле Object Pascal.
Для вызова конструктора следует указать имя класса, за которым следует точка-разделитель, имя конструктора и список параметров. Например:
varp: Person;
p := Person.Create('Иванов',20);
2 способ.С помощью операции new - в стиле C# (предпочтительный).
varp: Person;
p := new Person('Иванов',20);
Деструктор в Object Pascal - специальная процедура, уничтожающая объект и освобождающая динамическую память, которую этот объект занимал. При описании деструктора вместо служебного слова procedureиспользуется служебное слово destructor.
Например:
destructorDestroy;
begin
...
end;
Поскольку в PascalABC.NETпамять управляется сборщиком мусора, деструктор в PascalABC.NETне играет никакой роли и представляет собой обычную процедуру-метод.
Предварительное объявление классов
Два или более класса могут содержать в качестве полей объекты других классов, циклически ссылающиеся друг на друга.
Например:
type
AAA = class
b: BBB;
end;
BBB = class
a: AAA;
end;
Данный код вызовет ошибку компиляции, поскольку тип BBB в момент описания поля b еще не определен. В такой ситуации следует воспользоваться предварительным описанием класса в виде
ИмяКласса = class;
Предварительно описанный класс должен быть полностью описан в той же секции type:
type
BBB = class;
AAA = class
b: BBB;
end;
BBB = class
a: AAA;
end;
Внутри каждого нестатического метода неявно определяется переменная Self, ссылающаяся на объект, вызвавший этот метод.
Например:
type
A = class
i: integer;
constructorCreate(i: integer);
begin
Self.i := i;
end;
end;
В момент вызова конструктора Create объект будет уже создан. Конструкция Self.i ссылается на поле i этого объекта, а не на параметр i функции Create. Фактически в любом нестатическом методе перед именем любого поля и методу этого класса неявно присутствует Self.
Свойство внешне выглядит как поле класса, однако, при доступе к нему на чтение или запись позволяет выполнять некоторые действия. Свойство описывается в классе следующим образом:
propertyProp: тип readимя функции чтения writeимя процедуры записи;
Как правило, каждое свойство связано с некоторым полем класса и возвращает значение этого поля с помощью функции чтения , а меняет - с помощью процедуры записи . Функция чтения и процедура записи должны быть методами этого класса и иметь следующий вид:
Читать дальше