В данном примере код x:=1; l := new List
Конструкторы
Объекты создаются с помощью специальных методов, называемых
Конструктор представляет собой функцию, создающую объект в динамической памяти, инициализирующую его поля и возвращающую указатель на созданный объект. Этот указатель обычно сразу присваивается переменной типа класс. При описании конструктора вместо служебного слова function используется служебное слово constructor. Кроме того, для конструктора не указывается тип возвращаемого значения.
Например:
type
Person = class
private
nm: string;
ag: integer;
public
constructor Create(name: string; age: integer);
end;
...
constructor Person.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.
Для вызова конструктора следует указать имя класса, за которым следует точка-разделитель, имя конструктора и список параметров. Например:
var p: Person;
p := Person.Create('Иванов',20);
2 способ. С помощью операции new - в стиле C# (предпочтительный).
var p: Person;
p := new Person('Иванов',20);
Деструктор в Object Pascal - специальная процедура, уничтожающая объект и освобождающая динамическую память, которую этот объект занимал. При описании деструктора вместо служебного слова procedure используется служебное слово destructor.
Например:
destructor Destroy;
begin
...
end;
Поскольку в PascalABC.NET память управляется сборщиком мусора, деструктор в PascalABC.NET не играет никакой роли и представляет собой обычную процедуру-метод.
Предварительное объявление классов
Два или более класса могут содержать в качестве полей объекты других классов, циклически ссылающиеся друг на друга.
Например:
type
AAA = class
b: BBB;
end;
BBB = class
a: AAA;
end;
Данный код вызовет ошибку компиляции, поскольку тип BBB в момент описания поля b еще не определен. В такой ситуации следует воспользоваться предварительным описанием класса в виде
Предварительно описанный класс должен быть полностью описан в той же секции type:
type
BBB = class;
AAA = class
b: BBB;
end;
BBB = class
a: AAA;
end;
Переменная Self
Внутри каждого нестатического метода неявно определяется переменная Self, ссылающаяся на объект, вызвавший этот метод.
Например:
type
A = class
i: integer;
constructor Create(i: integer);
begin
Self.i := i;
end;
end;
В момент вызова конструктора Create объект будет уже создан. Конструкция Self.i ссылается на поле i этого объекта, а не на параметр i функции Create. Фактически в любом нестатическом методе перед именем любого поля и методу этого класса неявно присутствует Self.
Свойства
Свойство внешне выглядит как поле класса, однако, при доступе к нему на чтение или запись позволяет выполнять некоторые действия. Свойство описывается в классе следующим образом:
property Prop: тип read имя функции чтения write имя процедуры записи;
Как правило, каждое свойство связано с некоторым полем класса и возвращает значение этого поля с помощью
function getProp: тип;
procedure setProp(v: тип);
Обычно функция чтения и процедура записи описываются в приватной секции класса. Они могут быть виртуальными, в этом случае их уместно описывать в защищенной секции класса.