Листинг 5.12. Описание и вызов конструктора



unit Geoml;

Interface

Type

TGeomFigure  = class  {Заголовок класса TGeomFigure, класс автоматически          является наследником класса TObject}

End;

Implementation

Procedure CreateFigure;

Var

Figure: TGeomFigure;{Описание переменной — ссылки на экземпляр класса. Несмотря на то, что не указан  модификатор ^,переменная Figure является переменной-указателем}

 Begin

 Figure   := TGeomFigure.Create;{Вызов конструктора класса TGeomFigure, унаследованный от класса TObject, и сохранение ссылки на новый объект в переменной Figure}

end;

END.

 

Переопределение конструктора

 

Конструктор может быть переопределен в описании класса для выполнения дополнительной инициализации, характерной для экземпляров именно этого класса. Например, в конструкторе можно установить начальные значения свойств. Переопределение конструктора выполняется по обычным правилам переопределения методов, за исключением следующих моментов:

1.Конструктор родительского класса не обязательно должен быть помечен ключевым словом virtual, для того, чтобы его переопределить. Соответственно, если конструктор родительского класса не помечен как виртуальный или динамический, не требуется указание ключевого слова override в описании дочернего класса. Виртуальные конструкторы необходимы для работы с типами данных, являющимися ссылками на классы (а не на объекты). Такая ссылка используется, например, в конструкторе класса TCollection, предназначенного в Delphi для хранения динамических списков.

2. Существенным отличием в переопределении конструкторов и обычных методов, является возможность изменения параметров конструктора дочернего класса относительно конструктора родительского класса. Однако это возможно только в том случае, если конструктор не является виртуальным.

Заметим, что полное переопределение конструктора обычно недопустимо, так как конструктор, определенный в родительском классе, от которого наследуется дочерний класс, может выполнять некоторые действия, без которых невозможна корректная работа объекта. Для вызова версии конструктора, замененной в классе-наследнике, используется ключевое слово Inherited:

Inherited;

Таким образом, любой переопределенный конструктор может и (обычно) должен сначала вызвать ту версию конструктора, которую он переопределяет.

Если в классе-наследнике изменен список параметров родительского конструктора (например, список расширен), конструктор родительского класса вызывается с указанием его названия и передачей ему необходимых параметров:

Inherited Create (<Список параметров>) ;

Рассмотрим пример создания объекта с переопределением конструктора (листинг 5.13).

Листинг 5.13. Пример создания объекта с переопределением конструктора

unit  Geom2;

Interface

Type  

TGeomFigure = class{Заголовок класса TgeomFigure, класс автоматически является наследником класса Tobject}

Protected

Color: Integer;       {Описание свойства с областью видимости protected)

Public

Constructor Create(aColor: Integer);

{Заголовок конструктора (область видимости public), список параметров изменен по отношению к родительскому классу TObject, конструктор которого не имеет параметров}

End;

Implementation

Constructor TGeomFigure.Create;

{Заголовок описательной части конструктора}

Begin

Inherited Create; {Вызов конструктора родительского класса}

 Color := aColor; {Инициализация свойства, которая не может быть выполнена в родительском классе, так как свойство Color описано в классе TGeomFigure}

end;

End.

 

5.3.2. Использование экземпляра класса

Использование объекта заключается в вызове его методов и обращении к его свойствам аналогично работе с обычными переменными и подпрограммами, но с указанием переменной-объекта, к которому относятся эти свойства и методы:

<Объект>.<Свойство>

ИЛИ

<Объект>.<Метод>(<Список параметров>);

 Пример использования экземпляра класса показан в листинге 5.14.

Листинг 5.14. Пример использования экземпляра класса

unit Geom3;

Interface

Type

TGeomFigure = class

Protected

Color: Integer;

Public

Constructor Create(aColor: Integer);

Procedure Draw;        {Заголовок метода}

End;

Implementation

......... {Описание конструктора}

......... {Описание метода Draw}

Procedure UsingFigure;       {Описание процедуры, использующей объект класса TGeomFigure}

 Var

Figure: TGeomFigure;

Begin

Figure := TGeomFigure.Create(3); {Создание экземпляра класса TGeomFigure}

Figure.Draw;                 {Вызов метода Draw}

Figure.Color:= 13;  {Изменение значения свойства Color}

 end;

End.

 

5.3.3. Разрушение объекта. Деструктор

Объект, естественно, занимает место в памяти, которая необходима для хранения как свойств объекта, так и дополнительной информации, например, таблицы виртуальных методов. Для разрушения объекта и освобождения памяти, которая выделена для него в конструкторе, предназначен деструктор — специализированный метод, изначально определенный в классе TObject:

Destructor  Destroy; virtual;

Если в конструкторе объекта производится выделение памяти под какие-либо ресурсы или объект регистрируется в других объектах, передавая им ссылку на себя, то возникает необходимость переопределения деструктора для освобождения памяти и разрушения связей с другими элементами программы.

При переопределении деструктора необходимо указывать ключевое слово override, так как деструктор является виртуальным методом (помечен ключевым словом virtual в описании класса TObject). Последней командой описательной части деструктора должен быть вызов переопределенного деструктора родительского класса с помощью ключевого слова Inherited:

Inherited Destroy;

Прямой вызов деструктора не применяется для уничтожения экземпляра класса. Для этого предназначен метод Free,также описанный в классе TObject. Данный метод не может быть переопределен, так как не имеет в своем описании ключевого слова virtual, однако метод Free вызывает деструктор Destroy, поведение которого может быть специфическим (листинг 5.15).


Дата добавления: 2018-04-04; просмотров: 128;