Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП лекции Раздел 4.doc
Скачиваний:
16
Добавлен:
28.09.2019
Размер:
2.56 Mб
Скачать

4.12.2. Типы интерфейсов.

Интерфейс СОМ позволяет приложениям и различным компонентам обра­щаться к функциям данного компонента СОМ. К функциям компонента можно обращаться с помощью таблицы виртуальных функций (virtual function table), которая также называется viable (виртуальная таблица) или VTBL. Эта таблица не содержит реально существующих функций. Вместо них она содержит набор указателей на функции компонента. Компонент, которому необходимо получить доступ к функции другого компонента, обращается к таблице виртуальных функций. Клиенты не могут обращаться к VTBL напрямую. Для этого используется другой указатель, называемый указателем интерфейса (interface pointer), добавля­ющий промежуточный уровень доступа, который делает возможной реализацию этого интерфейса. Это означает, что клиент видит только указатель на указатель в таблице виртуальных функций. На рис. показана структура интерфейса СОМ.

IUnknown

IInterface1

IInterface2

Единственное требование к таблице VTBL интерфейса СОМ состоит в том, что первое поле в таблице должно быть указателем на интерфейс IUnknown. IUnknown — единственный интерфейс, который должен быть реализован в любом компоненте, чтобы последний мог стать компонентом СОМ. По существу, это дверь к другим интерфейсам, поскольку все другие интерфейсы наследуются из интерфейса IUnknown.

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

Компоненты используют интерфейсы для взаимодействия. После того, как интерфейс определен и опубликован (т.е. сделан общедоступным для использования без ограничений), его нельзя изменить. Одно из правил СОМ — программное обеспечение поддерживается неизменным интерфейсом после его опубликования. Если вы измените интерфейс, то должны опубликовать его как другой, новый интерфейс, а ранее опубликованный интерфейс останется не­изменным.

Этот принцип следует учитывать при планировании интерфейса. Хорошо поработав над планированием, вы уменьшите вероятность последующих из­менений программного кода. Пока интерфейс не изменен, программный код, использующий этот интерфейс, изменять не требуется. Если вы должным образом не спланируете интерфейсы, то весьма вероятно, что понадобится вносить изме­нения и в интерфейсы, и в программные коды.

Свойства интерфейсов

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

Интерфейс не является объектом. Интерфейс представляет собой просто связанный набор функций и методов, с помощью которых клиенты и объекты обмениваются информацией. Когда у клиента есть доступ к объекту, он не имеет ничего, кроме указателя интерфейса (interface pointer), с помощью кото­рого он может обратиться к функциям интерфейса. Этот указатель непрозрачен, т.е. скрывает все аспекты внутренней реализации. Вы не можете увидеть детали, относящиеся к объекту, например информацию о его состоянии. Такая ситуация противоположна указателям объекта (object pointer) в VC++, с помощью которого клиент может получить прямой доступ к данным объекта. В СОМ клиент может только вызывать функции интерфейса по имеющемуся указате­лю. Но это не ограничение — это именно то, что позволяет СОМ обеспечивать эффективную поддержку стандарта бинарного кода (binary standard), допус­кающего прозрачность месторасположения (location transparency).

Интерфейсы строго подразделены по типам. Каждый интерфейс имеет собственный уникальный идентификатор (GUID). Это предохраняет от кон­фликтов с другими интерфейсами.

Интерфейсы неизменны. Интерфейсы не имеют версий, что устраняет проблемы с версиями. Новая версия интерфейса, созданная добавлением или удалением функций или изменением его семантики, становится совершенно новым интерфейсом с новым идентификатором. Поэтому новый интерфейс не конфликтует со старым, даже если все изменения внесены.