Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Роджерсон Д. - Основы COM - 2000.pdf
Скачиваний:
412
Добавлен:
13.08.2013
Размер:
2.4 Mб
Скачать

29

Интерфейсы не всегда наследуются

Класс CA наследует поддерживаемые им интерфейсы. СОМ не требует, чтобы класс, реализующий интерфейсы, наследовал их, поскольку клиент никогда не видит иерархию наследования в компоненте СОМ. Наследование интерфейсов — это в чистом виде деталь реализации. Вместо того, чтобы собирать все интерфейсы в одном классе, Вы можете реализовать их отдельно и использовать указатели на соответствующие классы. Крейг Брокшмидт использует такой метод в своей книге Inside OLE. Мы будем использовать для реализации всех интерфейсов один класс, поскольку этот метод проще и легче для восприятия; он также делает программирование для СОМ на С++ более естественным.

Множественные интерфейсы и множественное наследование

Компоненты могут поддерживать сколь угодно много интерфейсов. Для поддержки нескольких интерфейсов мы используем множественное наследование. В листинге 2-1 CA является производным от двух интерфейсов IX и IY, которые он поддерживает. Благодаря поддержке множественных интерфейсов компонент можно рассматривать как набор интерфейсов.

Это определяет рекурсивно-вложенную природу компонентной архитектуры (см. рис. 2-3). Интерфейс — это набор функций, компонент — набор интерфейсов, а система — набор компонентов. Некоторые считают интерфейсы эквивалентами функциональных возможностей и при добавлении к компоненту новых интерфейсов говорят о появлении новых возможностей. Я же предпочитаю рассматривать интерфейсы как различные варианты поведения компонента. Набор интерфейсов соответствует набору таких вариантов.

Компонент 1

Компонент 2

 

Компонент n

 

Fx1

 

Fx1

 

 

Fx1

IX1

Fx2

IX1

Fx2

 

IX1

Fx2

...

...

 

...

 

Fxn

 

Fxn

 

 

Fxn

 

Fx1

 

Fx1

 

 

Fx1

IX2

Fx2

IX2

Fx2

...

IX2

Fx2

...

...

...

 

 

 

 

 

Fxn

 

Fxn

 

 

Fxn

 

...

 

...

 

 

...

 

Fx1

 

Fx1

 

 

Fx1

IXn

Fx2

IXn

Fx2

 

IXn

Fx2

...

...

 

...

 

Fxn

 

Fxn

 

 

Fxn

Рис. 2-3 Система компонентов — это набор компонентов, из которых каждый поддерживает набор интерфейсов, из которых каждый содержит набор функций

Конфликт имен

Поскольку компонент может поддерживать несколько интерфейсов, легко возникает конфликт имен функций этих интерфейсов. Действительно, СОМ нет до этого дела. Интерфейсы СОМ отвечают двоичному стандарту; клиент подключается к интерфейсу не по имени самого интерфейса или его функций. Клиент обращается к функции интерфейса по ее адресу в блоке памяти, представляющем интерфейс. Структура этого блока памяти будет рассмотрена в конце данной главы. Техника изменения имен интерфейсов и функций обсуждается в гл. 8.

Другое решение проблемы конфликта имен — отказ от множественного наследования. Классу, управляющему компонентом, нет необходимости наследовать каждый интерфейс; он может содержать указатели на другие классы, которые реализуют отдельные интерфейсы.

Конфликт имен интерфейсов встречался бы реже, если бы все разработчики СОМ следовали простому соглашению. Начинайте имена интерфейсов и функций с названия Вашей фирмы или программного продукта. Например, вместо IFly для продукта Xyz можно было бы использовать IXyzFly.

Теперь, став экспертами в реализации интерфейсов, снова погрузимся в теорию.

Теория интерфейсов, часть II

Перед реализацией интерфейсов я обещал, что позже дам некоторые дополнительные сведения из теории. Я Вас не обманывал. В этом разделе мы рассмотрим три вопроса: неизменность интерфейсов СОМ, полиморфизм и наследование интерфейсов.

Соседние файлы в предмете Программирование на C++