На этом шаге мы рассмотрим правила использования конструкторов.
Конструктор - это метод особого вида, который создает объекты и делает для них начальные установки. Заголовок конструкторов начинается с ключевого слова constructor.
Отметим, что в качестве имен конструкторов, в отличие от Borland Pascal, в котором применялся идентификатор Init, в Object Pascal рекомендуется использовать идентификатор Create.
Первый способ вызова использовался и ранее в Borland Pascal, a второй способ добавлен по той причине, что конструктор в Object Pascal выполняет не только инициализацию, но и создание объектов. Как было рассмотрено выше, все объекты в Object Pascal являются потомками класса TObject и, соответственно этому, наследуют базовый вариант конструктора Create, который описан в этом классе. Следовательно, если для создания объекта какого-либо класса достаточно только стандартных действий, то в этом классе конструктор можно не объявлять, а вызывать наследуемый из TObject.
type TSimpleClass = class FField : Integer; property Simple : Integer read FField write FField; end; var SimpleVar : TSimpleClass; implementation . . . . SimpleVar := TSimpleClass.Create; SimpleVar.Simple := 10; SimpleVar.Free;
Оператор присваивания только копирует значения объектов, но не выполняет создания и инициализации. Поэтому, если создать какой-либо объект и затем присвоить его другому объекту, для которого конструктор еще не был вызван, то при обращении к полям, свойствам и методам второго объекта произойдет блокировка системы.
При создании нового объекта конструктор всегда вызывается с помощью ссылки на имя класса:
SimpleVar := TSimpleClass.Create;
При этом сначала выполняются стандартные действия конструктора, которые заключаются в выделении в "куче" памяти для нового объекта и обнулении всех его полей (числовым полям присваивается нуль, строковым полям - пустая строка, указателям - nil), а затем выполняются действия, описанные для конструктора программистом. После этого конструктор возвращает указатель на созданный и инициализированный объект, который будет иметь такой же тип, какой был указан в операторе вызова конструктора.
Если конструктор вызывается как метод уже существующего объекта:
SimpleVar.Create;
или
inherited Create;
то выполняются только действия, описанные программистом, а стандартные начальные действия и возврат указателя не выполняются. Таким способом вызываются, как правило, наследуемые конструкторы.
Особым случаем являются виртуальные конструкторы, которые в зависимости от способа вызова работают по разному. Если виртуальный конструктор вызывается с помощью ссылки на имя класса, то он действует точно также, как и статический конструктор. Если же он вызывается как метод объекта, то позволяет выполнять полиморфические действия аналогично обычным виртуальным методам.
На следующем шаге мы поговорим о деструкторах.