- •Основные механизмы и положения объектно-ориентированного программирования
- •5.1. Инкапсуляция
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •5.2. Наследование
- •Interface
- •Implementation
- •Interface
- •Implementation
- •5.3. Жизненный цикл экземпляра класса
- •Interface
- •Implementation
- •Inherited;
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •5.4. Полиморфизм
- •5.4.1. Совместимость объектов
- •Класс в Экземпляр
- •Interface Type
- •Implementation
- •Interface
- •Implementation
- •If Figure is tLine
- •Interface
- •Implementation
- •Interface
- •Implementation
- •IColor: Integer;
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).
Листинг 5.15. Пример создания и разрушения объекта
unit Geom4;
Interface
Type
TGeomFigure = class {Заголовок класса TGeomFigure, класс автоматически является наследником класса TObject}
Protected
Color: Integer; {Описание свойства с областью видимости protected}
public
Constructor Create(aColor: Integer); {Заголовок конструктора (область видимости public) }
Destructor Destroy; override; {Заголовок деструктора (область видимости public) }
End;
Implementation {Заголовок описательной части конструктора}
Constructor TGeomFigure.Create;
Begin
Inherited Create; {Вызов конструктора родительского класса}
Color := aColor; {Инициализация свойства, которая не
может быть выполнена в родительском
классе, так как свойство Color
описано в классе TGeomFigure}
end;
Destructor TGeomFigure.Destroy; {Заголовок описательной
части деструктора}
begin
Inherited Destroy; {Вызов деструктора родительского класса}
end;
Procedure UsingFigure; {Описание процедуры, использующей объект класса TGeomFigure}
Var
Figure: TGeomFigure;
begin
Figure := TGeomFigure.Create(3); {Создание экземпляра класса TGeomFigure}
Figure.Draw; {Вызов метода Draw}
Figure.Color:= 13; {Изменение значения свойства Color}
Figure.Free; {Разрушение объекта, автоматический вызов деструктора Destroy}
end;
End.
