

| стрелялки |
| спорт |
| драки |
| стратегии |
| гонки |
| логические |
| азартные |
| аркады |
| эротические |
| фильмы онлайн |
| Директива 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. |
