.
Monday 21st of May 2012    

Информация

Счетчики

Голосование

Лучшая марка телефона
 

Реклама

фильмы онлайн

фильмы онлайн


Директива Implements
загрузка...

Директива Implements предназначена для делегирования интерфейса к определенному свойству:

property MyInterface: IMyInterface read FMyInterface implements IMyInterface;

В месте декларации свойства директива устанавливается последней и после нее указывается интерфейс. Если интерфейсов несколько, они перечисляются через запятую.

type

IMyInterface = interface

procedure P1;

procedure P2; end;

TMyClass = class(TObject, IMyInterface) FMyInterface: IMyInterface;

property MyInterface: IMyInterface read FMyInterface implements IMyInterface; end;

var

MyClass: TMyClass; MyInterface: IMyInterface;

begin

MyClass := TMyClass.Create;

MyClass.FMyInterface := implements IMyInterface MyInterface := MyClass; MyInterface. P1; end;

Отвечающий за реализацию интерфейса объект вправе делегировать реализацию интерфейса другим классам и интерфейсам. Для этого предназначена директива implements.

Базовый класс интерфейсов в Delphi - интерфейс IUnknown

В роли базового класса для всех интерфейсов в Delphi выступает интерфейс IUnknown, который описан в модуле System и поэтому присутствует практически во всех проектах. Интерфейс IUnknown отвечает за:

• поддержку механизма подсчета ссылок на интерфейс;

• проверку наличия у объекта определенного интерфейса.

ОБ среде Delphi у интерфейса IInterface есть абсолютный двойник - интерфейс IUnknown. Он объявлен в модуле System сразу за определением интерфейсного класса IInterface:

IUnknown = IInterface;

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

Следующие два метода управляют счетчиком интерфейсного объекта:

function _AddRef: Integer; stdcall; // увеличение счетчика function _Release: Integer; stdcall; // уменьшение счетчика

В момент достижения счетчиком нулевого значения объект самостоятельно выгружает себя из памяти. Третий и последний метод интерфейса IInterface:

function QueryInterface( const IID: TGUID; out Obj): HResult; stdcall;

Благодаря этой функции мы запрашиваем объект на предмет наличия у него интерфейса IID. Переменная Obj передается для получения ссылки на интерфейс. В случае положительного ответа функция самостоятельно обратится кметоду _AddRef() вызываемого интерфейса и возвратит указатель на интерфейс; в противном случае Obj будет ссылаться в никуда - nil.

Поддержка интерфейсов реализована в базовом классе TObject благодаря методу:

function GetInterface(const IID: TGUID; out Obj): Boolean.


загрузка...
 

Самое популярное:

bottom

карта сайта