На этом шаге мы рассмотрим один из способов повторного использования COM-объектов.
Разработчики СОМ повторно используют существующие СОМ-объекты, применяя методы вложения и агрегации. Выбор метода зависит от того, как один объект - он носит название внешний (outer object) - повторно использует код другого - внутреннего объекта (inner object).
В CОМ вложение похоже на аналогичную методику C++, описанную на предыдущем шаге. Внешний объект создает внутренний, обычно вызывая CoCreateInstance(), и сохраняет ссылку на него в виде переменной-члена. Внешний объект реализует интерфейсы внутреннего через интерфейсы заглушки, пересылающие запросы метода внутреннему объекту.
На рисунке 1 показан внешний СОМ-объект с интерфейсом ICar содержащий другой СОМ-объект с интерфейсом IVehicle и предоставляющий оба интерфейса.
Рис.1. Вложение в СОМ
Внешний объект не обязательно предоставляет все интерфейсы внутреннего. Так же как и при вложении в C++, интерфейс внешнего объекта способен управлять доступом к внутреннему объекту и, кроме того, влияет на порядок предоставления услуг последнего. Внешний объект не пересылает вызовы методов IUnknown во внутренний, потому что тот ничего не знает об интерфейсах, предоставляемых внешним объектом. Например, клиент объекта, изображенного на рисунке 1, ожидает, что указатель на IUnknown можно использовать для вызова как ICar, так и IVehicle. Указатель на интерфейс IUnknown внутреннего объекта не способен обслуживать запросы по указателю на ICar.
На следующем шаге мы рассмотрим агрегацию.