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

108

У наследования реализации своя область применения. В следующей главе я буду использовать его, чтобы избавиться от необходимости реализовывать IUnknown для каждого компонента. Но в этой главе мы остановимся на включении компонентов.

Включение и агрегирование

Может быть, это национальная особенность, но, по-моему, мало кто в США доволен существующим положением дел. Мы всегда хотим все улучшить — поэтому постоянно изменяем все подряд, от прически до собственного дома. Так мы поступаем и с компонентами. После того, как кто-то дал Вам компонент, Вы наверняка захотите расширить или подстроить его под свои задачи. Кроме того, Вы можете захотеть использовать новый, усовершенствованный компонент. В С++ подстройка реализуется с помощью включения и наследования. В СОМ компоненты подстраиваются (специализируются) с помощью включения (containment) и агрегирования

(aggregation).

Включение и агрегирование — это приемы программирования, в которых один компонент использует другой. Я называю эти два компонента внешним (outer component) и внутренним (inner component) соответственно. Внешний компонент или агрегирует, или включает в себя внутренний.

Включение

Включение в СОМ похоже на включение в С++. Однако, как и все в СОМ, включение выполняется на уровне интерфейсов. Внешний компонент содержит указатели на интерфейсы внутреннего. Внешний компонент — просто клиент внутреннего компонента. Используя интерфейсы последнего, он реализует свои собственные интерфейсы (рис. 8-1).

Внешний компонент

IX

IY

Внутренний компонент

IZ

Рис. 8-1 Внешний компонент содержит внутренний компонент и использует его инетфрейс IZ.

Внешний компонент может также реализовывать заново интерфейс, поддерживаемый внутренним, передавая последнему вызовы этого интерфейса. Внешний компонент может специализировать этот интерфейс, добавляя свой код перед вызовом внутреннего компонента и после этого (рис. 8-2).

Внешний компонент

IX

IY

Внутренний компонент

IY

Рис. 8-2 Внешний компонент содержит внутренний компонент и повторно использует его реалищацию интерфейса IY.

Агрегирование

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

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