Конструкторы и деструкторы
Особой разновидностью методов являются конструкторы и деструкторы. Напомним, что конструкторы создают, а деструкторы разрушают объекты. Создание объекта включает выделение памяти под экземпляр и инициализацию его полей, а разрушение — очистку полей и освобождение памяти.
Действия по инициализации и очистке полей специфичны для каждого конкретного класса объектов. По этой причине язык Delphi позволяет переопределитьстандартный конструктор Create и стандартный деструктор Destroy для выполнения любых полезных действий. Можно даже определить несколько конструкторов и деструкторов (имена им назначает сам программист), чтобы обеспечить различные процедуры создания и разрушения объектов.
Объявление конструкторов и деструкторов похоже на объявление обычных методов с той лишь разницей, что вместо зарезервированных слов function и procedure используются слова constructor и destructor. Для нашего класса TFigure потребуется конструктор, которому в качестве параметра будет передаваться начальная позиция объекта:
Type TFigure = class ... // Конструкторы и деструкторы constructor Create(const Left,Top:integer); destructor Destroy; override; ... end; |
Приведем их возможную реализацию:
constructor TFigure.Create(const Left,Top:integer);begin Coords.x:=left; Coords.y:=top;end; destructor TFigure.Destroy;begin // Пока ничего не делаемend; |
Если объект содержит встроенные объекты или другие динамические данные, то конструктор — это как раз то место, где их нужно создавать.
Конструктор применяется к классу или к объекту. Если он применяется к классу,
Figure := TFigure.Create(100,200); |
то выполняется следующая последовательность действий:
- в динамической памяти выделяется место для нового объекта;
- выделенная память заполняется нулями. В результате все числовые поля и поля порядкового типа приобретают нулевые значения, строковые поля становятся пустыми, а поля, содержащие указатели и объекты получают значение nil;
- затем выполняются заданные программистом действия конструктора;
- ссылка на созданный объект возвращается в качестве значения конструктора. Тип возвращаемого значения совпадает с типом класса, использованного при вызове (в нашем примере это тип TDelimitedReader).
Если конструктор применяется к объекту,
Figure.Create(100,200); |
то конструктор выполняется как обычный метод. Другими словами, новый объект не создается, а происходит повторная инициализация полей существующего объекта. В этом случае конструктор не возвращает никакого значения. Далеко не все объекты корректно себя ведут при повторной инициализации, поскольку программисты редко закладывают такую возможность в свои классы. Поэтому на практике повторная инициализация применяется крайне редко.
Деструктор уничтожает объект, к которому применяется:
Figure.Destroy; |
В результате:
- выполняется заданный программистом код завершения;
- освобождается занимаемая объектом динамическая память.
В теле деструктора обычно должны уничтожаться встроенные объекты и динамические данные, как правило, созданные конструктором.
Как и обычные методы, деструктор может иметь параметры, но эта возможность используется редко.
Свойства
Понятие свойства
Помимо полей и методов в объектах существуют свойства.
1. При работе с объектом свойства выглядят как поля: они принимают значения и участвуют в выражениях. Но в отличие от полей свойства не занимают места в памяти, а операции их чтения и записи ассоциируются с обычными полями или методами. Это позволяет создавать необходимые сопутствующие эффекты при обращении к свойствам. Создание сопутствующего эффекта достигается тем, что за присваиванием свойству значения стоит вызов метода.
2. Объявление свойства выполняется с помощью зарезервированного слова property:
property propertyName[indexes]: type index integerConstant specifiers; |
Где:
· propertyName – любой корректный идентификатор;
· type – предопределенный или декларированный раньше тип;
· specifiers – спецификаторы доступа;
· [indexes] – необязательный параметр, который позволяет описать индексированное свойство (свойство-массив);
· index integerConstant – необязательная секция, содержащая ключевое слово index и некоторую константу типа Integer (передается автоматически как параметр для методов, указанных в спецификаторах доступа), используется для методов, обслуживающих несколько свойств.
Простейший пример:
Type Tfigure = class private Fcolor:TColor; ... Protected //Метод записи (установки значения)свойства Procedure setColor(c:TColor); virtual; Property Color: TColor read Fcolor write setcolor; // Свойство end; |
3. При объявлении свойства используются ключевые слова: read, write, stored, default (nodefault)иimplements,которыеназываются спецификаторами доступа. Каждое свойство должно обязательно содержать хотя бы один из спецификаторов: read, write.
· read – указывается поле или метод, к которому происходит обращение при чтении (получении) значения свойства. Например, чтение свойства Color означает чтение поля Fcolor.
· write — поле или метод, к которому происходит обращение при записи (установке) значения свойства. Например, установка свойства — вызов метода SetColor.
· stored –
4. Чтобы имена свойств не совпадали с именами полей, последние принято писать с буквы F (от англ. field).
5. Обращение к свойствам выглядит в программе как обращение к полям:
var Fugure: TFigure;... Figure.Color := red; // Эквивалентно Figure.SetColor(red); If Figure.Color = red then // Эквивалентно Figure.Fcolor; ShowMessage(‘Красный’); |
6. Если один из спецификаторов доступа опущен, то значение свойства можно либо только читать (задан спецификатор read), либо только записывать (задан спецификатор write). В следующем примере объявлено свойство, значение которого можно только читать.
7. В отличие от полей свойства не имеют адреса в памяти, поэтому к ним запрещено применять операцию @. Как следствие, их нельзя передавать в var- и out-параметрах процедур и функций.
8. Технология объектно-ориентированного программирования в среде Delphi предписывает избегать прямого обращения к полям, создавая вместо этого соответствующие свойства. Это упорядочивает работу с объектами, изолируя их данные от непосредственной модификации. В будущем внутренняя структура класса, которая иногда является достаточно сложной, может быть изменена с целью повышения эффективности работы программы. При этом потребуется переработать только методы чтения и записи значений свойств; внешний интерфейс класса не изменится.
Дата добавления: 2016-02-09; просмотров: 814;