Чтобы от описания класса перейти к объекту, следует выполнить соответствующее объявление в секции var:
При работе с обычными типами данных этого объявления было бы достаточно для получения экземпляра типа. Однако объекты в среде Delphi являются динамическими данными, т.е. распределяются в динамической памяти. Поэтому переменная Figure — это просто ссылка на экземпляр (объект в памяти), которого физически еще не существует.
Чтобы сконструировать объект (выделить память для экземпляра) класса TFigure и связать с ним переменную Figure, нужно в тексте программы поместить следующий оператор:
Figure := TFigure.Create; |
Create — это так называемый конструктор объекта; он всегда присутствует в классе и служит для создания и инициализации экземпляров. При создании объекта в памяти выделяется место только для его полей. Методы, как и обычные процедуры и функции, помещаются в область кода программы; они умеют работать с любыми экземплярами своего класса и не дублируются в памяти.
После создания объект можно использовать в программе: получать и устанавливать значения его полей, вызывать его методы. Доступ к полям и методам объекта происходит с помощью уточненных имен, например:
Кроме того, как и при работе с записями, допустимо использование оператора with, например:
Если объект становится ненужным, он должен быть удален вызовом специального метода Destroy, например:
Figure.Destroy; // Освобождение памяти, занимаемой объектом |
Destroy — это так называемый деструктор объекта; он присутствует в классе наряду с конструктором и служит для удаления объекта из динамической памяти. После вызова деструктора переменная Figure становится несвязанной и не должна использоваться для доступа к полям и методам уже несуществующего объекта. Чтобы отличать в программе связанные объектные переменные от несвязанных, последние следует инициализировать значением nil. Например, в следующем фрагменте обращение к деструктору Destroy выполняется только в том случае, если объект реально существует:
Figure := nil;...if Figure <> nil then Figure.Destroy; |
Вызов деструктора для несуществующих объектов недопустим и при выполнении программы приведет к ошибке.
Чтобы избавить программистов от лишних ошибок, в объекты ввели предопределенный метод Free, который следует вызывать вместо деструктора. Метод Free сам вызывает деструктор Destroy, но только в том случае, если значение объектной переменной не равно nil. Поэтому последнюю строчку в приведенном выше примере можно переписать следующим образом.
После уничтожения объекта переменная Figure сохраняет свое значение, продолжая ссылаться на место в памяти, где объекта уже нет. Если эту переменную предполагается еще использовать, то желательно присвоить ей значение nil, чтобы программа могла проверить, существует объект или нет. Таким образом, наиболее правильная последовательность действий при уничтожении объекта должна быть следующая:
Figure.Free;Figure := nil; |
С помощью стандартной процедуры FreeAndNilэто можно сделать проще и элегантнее:
FreeAndNil(Figure); // Эквивалентно: Figure.Free; Figure := nil; |
Значение одной объектной переменной можно присвоить другой. При этом объект не копируется в памяти, а вторая переменная просто связывается с тем же объектом, что и первая:
var R1, R2: TFigure; // Переменные R1 и R2 не связаны с объектомbegin R1 := TFigure.Create; // Связывание переменной R1 с новым объектом // Переменная R2 пока еще не связана ни с каким объектом R2 := R1; // Связывание переменной R2 с тем же объектом, что и R1 // Теперь обе переменные связаны с одним объектом R2.Free; // Уничтожение объекта // Теперь R1 и R2 не связаны ни с каким объектом end; |
Объекты могут выступать в программе не только в качестве переменных, но также элементов массивов, полей записей, параметров процедур и функций. Кроме того, они могут служить полями других объектов. Во всех этих случаях программист фактически оперирует указателями на экземпляры объектов в динамической памяти. Следовательно, объекты изначально приспособлены для создания сложных динамических структур данных, таких как списки и деревья. Указатели на объекты для этого не нужны.
Итак, вы уже имеете некоторое представление об объектах, перейдем теперь к вопросу реализации их методов.