

| стрелялки |
| спорт |
| драки |
| стратегии |
| гонки |
| логические |
| азартные |
| аркады |
| эротические |
| фильмы онлайн |
| Интерфейс |
|
По своей сути интерфейс - это договор между COM-объектом и клиентским приложением, в котором COM-объект гарантирует клиенту предоставление некоторых услуг. Услуги - это определенные в интерфейсе методы. Но хотя интерфейс и имеет право объявлять заголовки методов, но ни один из его методов не имеет описания. Это объясняется тем, что у интерфейса нет раздела реализации, он лишь декларирует названия методов и перечень параметров. Клиенты могут получить доступ к данным COM-объекта только с помощью указателя на интерфейс. Другим значимым аспектом интерфейса является то, что если COM-объект заявляет о существовании у него определенного интерфейса, то объявленный интерфейс должен обязательно поддерживаться внутренними методами объекта и возвращать какие-либо значения, пусть хотя бы банальное сообщение об ошибке. Интерфейсы могут наследоваться - дочерний интерфейс должен включать все методы своего предка. Все существующие интерфейсы наследуются от базового интерфейса IUnknown. Выделим еще два правила, соблюдение которых необходимо при проектировании COM-объекта: • Единожды опубликованный интерфейс не может быть изменен. При необходимости дополнить существующий интерфейс новыми функциональными возможностями следует создать новый интерфейс. Выполнение этого правила гарантирует, что запрашивающее конкретный интерфейс клиентское приложение получит именно то, на что оно рассчитывает. • В рамках отдельной системы каждый интерфейс должен иметь уникальный идентификатор GUID и название, начинающееся с символа «I». Особенности определения интерфейсов в Delphi Начиная с Delphi 3 появилась возможность описания интерфейсов в модуле программы. Объявление типа интерфейса имеет следующий синтаксис: type Имя_интерфейса = interface (интерфейс_предок) ['{GUID}'] // глобальный уникальный идентификатор класса {коллекция методов} end; На первый взгляд форма определения интерфейса схожа с объявлением обычного класса VCL. Отличие состоит в том, что в момент декларации интерфейс должен связываться с глобальным идентификатором GUID. Но на этом особенности определения интерфейса в Delphi не ограничиваются. Интерфейс не может обладать полями, обработчиками событий, конструкторами и деструкторами, и, что очень важно, интерфейс не имеет секции реализации. Единственное, что он может, - объявлять методы (и иногда свойства). В качестве примера определения интерфейса приведем описание основоположника всех интерфейсов в Delphi - IInterface: type IInterface = interface [¦{00000000-0000-0000-C000-000000000046}'] function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; end; Для автоматической генерации нового GUID, находясь в редакторе кода, нажмите комбинацию клавиш <Ctrl+Shift+G>. На порядок объявления входящих в коллекцию методов также наложен ряд ограничений. Например мы не вправе пользоваться любимыми директивами virtual, dynamic, abstract и override. После объявления метода программист должен указать используемое соглашение о вызовах. Так, стандартное соглашение stdcall позволит обращаться к интерфейсам Windows, а для работы с интерфейсами CORBA потребуется соглашение safecall. Если же соглашение не указано, Delphi будет использовать соглашение register. ©Достаточно часто интерфейс сравнивают с контрактом, заключенным между двумя джентльменами - приложением-клиентом и COM-объектом. Поскольку определение интерфейса одновременно используется COM-объектом и клиентом, то контракт гарантирует клиенту, что COM-объект выполнит возложенные на него обязательства и реализует описанные в интерфейсе методы. Как и обычные классы, интерфейсы поддерживают наследование и в состоянии передавать от предка к потомку определенные в них свойства и методы. Однако, в отличие от обычного класса, интерфейс не может наполнить свои методы содержанием. |
