Записки себе: агрегация

Персональный блог одноименного форумчанина. Человека и парохода, не побоюсь этого сравнения :)

Модератор: tyomitch

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Записки себе: агрегация

Сообщение tyomitch » 13.04.2007 (Пт) 22:42

(Я лучше понимаю, когда пишу, чем когда читаю. Если вам эта писанина бесполезна, просто не обращайте на неё внимания.)

Цель агрегации: образовать общий IUnknown для всех внутренних объектов, каждый из которых имеет свой собственный IUnknown.

* Параметр pUnkOuter метода IClassFactory::CreateInstance передаёт внутреннему объекту ссылку на общий IUnknown. В результате у внутреннего объекта должны оказаться две реализации IUnknown: одна управляет им самим, и видна только внешнему объекту агрегата; вторая, наследуемая всеми его интерфейсами и потому видимая снаружи агрегата, делегирует вызовы на общий IUnknown. Счётчик ссылок на внутренних IUnknown остаётся единицей на всём времени жизни агрегата.

* Внешний объект агрегата создаёт все внутренние объекты, передавая им ссылку на свой IUnknown как на общий. QueryInterface на нём должен, видимо, по цепочке вызывать QueryInterface на управляющих IUnknown внутренних объектов. Вся реализация внешнего объекта сводится, в итоге, к созданию внутренних объектов в IClassFactory::CreateInstance и их поочерёдному опросу в IUnknown::QueryInterface. Вроде как оба куска тривиальные, почему же нет стандартной функции CoCreateAggregateFactory, принимающей массив CLSID (или даже, для гибкости, массив IClassFactory для внутренних классов) и возвращающей IClassFactory для класса-агрегата?

* Наконец, если внешний объект агрегата сам создан как внутренний объект более крупного агрегата, то он передаёт своим внутренним объектам ссылку не на свой IUnknown, а на полученный от своего внешнего объекта IUnknown самого внешнего объекта агрегата. Таким образом можно собирать в один объект целые грозди несвязанных реализаций разнообразных интерфейсов. Только они должны все различаться, и не иметь общих предков, кроме IUnknown, иначе результат QueryInterface окажется зависящим от порядка обхода им внутренних объектов.

* Родными средствами VB агрегация совсем не поддерживается: нельзя ни слепить агрегат из готовых объектов, ни использовать созданные в VB объекты в составе агрегата. Жаль.

(Если я чего-нибудь напутал, буду рад, если меня поправят.)
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 16.04.2007 (Пн) 22:48

А что дает агрегация?
الفيجوال بيسك الرابح

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.04.2007 (Пн) 22:56

По задумке -- наследование реализации, в т.ч. множественное, родными средствами COM (независимыми от языка).

В моём случае -- возможность привязать время жизни моего объекта ко времени жизни чужого.
Изображение


Вернуться в Tyomitch

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList