Конструкторы и деструкторы




Особой разновидностью методов являются конструкторы и деструкторы. Напомним, что конструкторы создают, а деструкторы разрушают объекты. Создание объекта включает выделение памяти под экземпляр и инициализацию его полей, а разрушение — очистку полей и освобождение памяти.

Действия по инициализации и очистке полей специфичны для каждого конкретного класса объектов. По этой причине язык 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 предписывает избегать прямого обращения к полям, создавая вместо этого соответствующие свойства. Это упорядочивает работу с объектами, изолируя их данные от непосредственной модификации. В будущем внутренняя структура класса, которая иногда является достаточно сложной, может быть изменена с целью повышения эффективности работы программы. При этом потребуется переработать только методы чтения и записи значений свойств; внешний интерфейс класса не изменится.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: