Главная » Уроки по ООП » Урок 5. Иерархия базовых классов

Урок 5. Иерархия базовых классов

Все классы библиотеки визуальных компонентов произошли от группы базовых классов, которые лежат в основе иерархии VCL. Самый общий предок компонентов — это класс TObject, инкапсулирующий простейший объект. Как известно, каждый объект наследует свойства и методы родительского класса. К объекту можно добавить новые свойства и методы, но нельзя удалить унаследованные. Объект-наследник в свою очередь может стать родительским для нового класса, который унаследует возможности всех своих предков.

Иерархия базовых классов

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


Благодаря механизму наследования свойств и методов, потомки базовых классов умеют "общаться" друг с другом; работают в среде разработки, взаимодействуя с Палитрой компонентов и Инспектором объектов; распознаются операционной системой как элементы управления и окна.

Класс TObject
Класс TObject является родоначальником всей иерархии использующихся в Delphi классов VCL. Он реализует функции, которые обязательно будет выполнять любой объект, который может быть создан в среде разработки.

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

Кроме этого, класс TObject обеспечивает создание и хранение информации об экземпляре объекта и обслуживание очереди сообщений.

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

Метод

class function Classlnfo: Pointer;

возвращает указатель на таблицу информации времени выполнения (RTTI). Эта информация используется в среде разработки и в приложении.

Функция

class function ClassName: ShortString;

возвращает имя типа объекта, которое может быть использовано для идентификации.

Метод

class function ClassNameIs(const Name: string): Boolean;

позволяет определить, является ли данный объект того типа, имя которого передано в параметре Name. В случае положительного ответа функция возвращает True.

Как известно, программирование для Windows основано на событиях. Каждое приложение и каждый программный объект должны уметь реагировать на сообщение о событиях и, в свою очередь, рассылать сообщения. В выполнении этих операций заключается третья общая для всех объектов функция.
Метод
procedure Dispatch(var Message); virtual;
осуществляет обработку сообщений, поступающих объекту. Он определяет, сможет ли объект обработать сообщение при помощи собственных обработчиков событий. В случае отсутствия таких методов сообщение передается аналогичному методу Dispatch класса-предка (если он есть).
Класс TObject имеет предопределенный обработчик событий:
procedure DefaultHandler(var Message); virtual;
Класс TObject имеет еще несколько методов, которые в основном применяются для взаимодействия объекта со средой разработки.
В целом класс TObject может служить для создания на его основе некоторых простых классов для использования в приложениях.

Класс TPersistent происходит непосредственно от класса TObject. Он обеспечивает своих потомков возможностью взаимодействовать с другими объектами и процессами на уровне данных. Его методы позволяют передавать данные в потоки, а также обеспечивают взаимодействие объекта с Инспектором объектов.
"Persistent" в переводе с английского означает "устойчивый", "постоянный". Что же такого постоянного в одноименном классе? Ответ таков: виртуальный метод
procedure Assign(Source: TPersistent);
Этот важнейший метод осуществляет копирование содержимого одного объекта (source) в другой (self, т.е. в объект, вызвавший метод Assign). При этом объект-получатель остается самим собой, чего нельзя достигнуть, используя простое присваивание переменных объектного типа:
FirstObject:= SecondObject;
Ведь в этом случае указатель на одну область адресного пространства, содержащую экземпляр класса (объект), замещается указателем на другую область адресного пространства, содержащую другой объект.
Метод Assign позволяет продублировать объект — присвоить одному объекту значения всех свойств другого. При этом объекты не обязательно должны быть одного и того же класса; более того, они не обязательно должны находиться в отношениях "родитель-потомок".

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

Класс TComponent

Класс TComponent является предком всех компонентов VCL. Он используется в качестве основы для создания невизуальных компонентов и реализует основные механизмы, которые обеспечивают функционирование любого компонента.
Механизмы, реализованные в классе TComponent, обеспечивают взаимодействие компонента со средой разработки, главным образом с Палитрой компонентов и Инспектором объектов. Благодаря возможностям этого класса, компоненты начинают работать на форме проекта уже на этапе разработки.
В нем появляются первые свойства, которые отображаются в Инспекторе объектов.

property Name: TComponentName; свойство содержит имя экземпляра компонента, которое используется для идентификации компонента в приложении
property Tag: Longint; является вспомогательным и не влияет на работу компонента. В нем можно хранить числовое значение, например для более удобной идентификации компонентов

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

Свойство (метод) Описание
property Components [Index: Integer]: TComponent ;

Содержит индексированный список указателей всех компонентов, для которых данный компонент является владельцем (owner)

property ComponentCount : Integer; Число подчиненных компонентов
property Owner: TComponent; Указывается, какой компонент является владельцем данного
property ComponentIndex: Integer; Индекс данного компонента в списке владельца
procedure InsertComponent (AComponent: TComponent) ; Вставляет компонент AComponent в список
procedure RemoveComponent (AComponent : TComponent); Удаляет компонент AComponent из списка
procedure FindComponent (AName: string): TComponent; Осуществляет поиск компонента по имени AName
procedure DestroyComponents; Предназначен для уничтожения всех компонентов, подчиненных данному

Очень важное свойство
property ComponentState: TComponentState;
дает представление о текущем состоянии компонента. Состояние может измениться в результате получения компонентом некоторого сообщения, действий разработчика, выполнения акции и т. д. Это свойство активно используется средой разработки.

Задание: Все установленные на форме компоненты TCheckBox установить в положение checked:
Ход решения: Установите на форме несколько компонентов CheckBox и кнопку. В обработчик события нажатия кнопки добавьте следующий код:

Определение принадлежности к классу и приведение типов объектов
Оператор is
Чтобы определить ссылка на объект какого именно типа находится в той или иной переменной, используется оператор is, проверяющий принадлежность объекта к заданному классу.
Оператор is возвращает логическое значение (True или False) и используется в следующем виде:

<Ссылка на объект> is <Название класса>

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

<Ссылка на объект> as <Название класса>

В результате такого указания Delphi пытается обращаться к объекту, на который указывает ссылка, как к экземпляру заданного класса.

Задание: составить программу, которая будет при установке флажка в компоненте CheckBox делать недоступными все кнопки формы.

 

Составитель: Салий Н.А.

Яндекс.Метрика
Сайт создан в системе uCoz