Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Использование виртуальных конструкторов и ссылок на класс. Контроль принадлежности объекта классу.

Поиск

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

Конструктор — это метод, который вызывается только один раз в момент создания

экземпляра объекта соответствующего класса. Конструктор считается методом класса

(class procedure), что позволяет вызывать его, указывая не только имя объекта, но и

имя класса. Для конструктора выделено специальное ключевое слово constructor.

constructor CreateMyObject(MySize: Integer);

Конструкторов у объекта может быть сколько угодно, однако создаваться объект

может с помощью только одного из них.

') ПОДСКАЗКА В базовом классе TObjecl имеется готовый конструктор Create,

который и рекомендуется использовать, если нет необходимости в

конструкторах с особыми возможностями. В любом случае в реали-

зации собственного конструктора желательно вызывать базовый

конструктор Creole с помощью директивы inherited.

Деструктор — это метод, который вызывается только один раз в момент уничтоже-

ния экземпляра объекта соответствующего класса. Класс TObject имеет стандартный

деструктор Destroy, Разрешается создавать неограниченное число деструкторов с

помощью ключевого слова destructor:

destructor MyDestructor;

ПОДСКАЗКА Рекомендуется создавать в классе только один деструктор, а в его

реализации вызывать деструктор Destroy базового класса TObject

с помощью директивы inherited.

Тип ≪класс≫

В Паскале имеется возможность объявлять новый тип, являющийся ссылкой на класс:

type имя-класса - class of тип-класса;

Например:

type TMetaClass = class of TObject;

Классы и объекты 95

Переменная, описанная как

var MetaClass: TMetaClass;

может хранить в себе объект любого класса, унаследованного oTTObject. Это позволяет

записывать в подобные переменные объекты произвольных классов во время выпол-

нения программы, не зная конкретных типов этих объектов. Например, если имеется

стандартная подпрограмма обработки объектов, тип которых будет известен только в

процессе работы приложения, то в качестве типа соответствующего параметра надо ука-

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

можно задавать объект, имеющий произвольный тип, унаследованный от TObject

procedure UseObject(Obj: TMetaClass);

UseObjectl TButton);

UseObject(TEdit);

Классы TButton и TEdit — стандартные классы Delphi, описывающие компоненты

≪кнопка≫- и ≪текстовое поле≫.

Проверка типа объекта

Так как в Паскале допускается применять объекты, тип которых на этапе компи-

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

проверки типов таких объектов.

Специальная операция Is (ключевое слово) позволяет проверить, соответствует

ли тип объекта конкретному типу Паскаля.

объект is тип

В качестве типа должен указываться один из классов.

Obj is TButton

Это выражение возвращает значение логического типа (True, если тип объекта Obj

соответствует типу, указанному в правой части, — TButton).

Приведение типа объекта

Если объект описан как ссылка на класс, то часто требуется применять этот объект как

относящийся к конкретному типу, чтобы иметь доступ к его определенным полям и

методам. Выполнить приведение к конкретному типу можно, применив операцию as:

объект as класс

Например, если в переменную MetaClass записан объект с типом TEdit, то получить

доступ к полю Text класса TEdit можно с помощью следующей конструкции:

(MetaClass as TEdit).Text:= 'содержимое1;

Ссылки на классы

Язык Delphi позволяет рассматривать классы объектов как своего рода объекты, которыми можно манипулировать в программе. Такая возможность рождает новое понятие — класс класса; его принято обозначать термином метакласс.

Для поддержки метаклассов введен специальный тип данных — ссылка на класс (class reference). Он описывается с помощью словосочетания class of, например:

type TTextReaderClass = class of TTextReader;

 

Переменная типа TTextReaderClass объявляется в программе обычным образом:

var ClassRef: TTextReaderClass;

 

Значениями переменной ClassRef могут быть класс TTextReader и все порожденные от него классы. Допустимы следующие операторы:

ClassRef:= TTextReader;ClassRef:= TDelimitedReader;ClassRef:= TFixedReader;

 

По аналогии с тем, как для всех классов существует общий предок TObject, у ссылок на классы существует базовый тип TClass, определенный, как:

type TClass = class of TObject;

 

Переменная типа TClass может ссылаться на любой класс.

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

Физический смысл и взаимосвязь таких понятий, как переменная-объект, экземпляр объекта в памяти, переменная-класс и экземпляр класса в памяти поясняет рисунок 3.4.


Рисунок 3.4. Переменная-объект, экземпляр объекта в памяти, переменная-класс и экземпляр класса в памяти

Виртуальные конструкторы

Особые возможности ссылок на классы проявляется в сочетании с виртуальными конструкторами. Виртуальный конструктор объявляется с ключевым словом virtual. Вызов виртуального конструктора происходит по фактическому значению ссылки на класс, а не по ее формальному типу. Это позволяет создавать объекты, классы которых неизвестны на этапе компиляции. Механизм виртуальных конструкторов применяется в среде Delphi при восстановлении компонентов формы из файла. Восстановление компонента происходит следующим образом. Из файла считывается имя класса. По этому имени отыскивается ссылка на класс (метакласс). У метакласса вызывается виртуальный конструктор, который создает объект нужного класса.

var P: TComponent; T: TComponentClass; // TComponentClass = class of TComponent;... T:= FindClass(ReadStr); P:= T.Create(nil);...

 

На этом закончим изучение теории объектно-ориентированного программирования и в качестве практики рассмотрим несколько широко используемых инструментальных классов среды Delphi. Разберитесь с их назначением и работой. Это поможет глубже понять ООП и пригодится на будущее.



Поделиться:


Последнее изменение этой страницы: 2017-02-21; просмотров: 246; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.140.195.8 (0.006 с.)