Поделиться через


Несколько сдвоенных интерфейсов

Вы можете объединить преимущества двойного интерфейса (т. е. гибкость как vtable, так и поздней привязки, что делает класс доступным для языков сценариев, а также C++) с методами множественного наследования.

Хотя можно предоставить несколько двух интерфейсов для одного COM-объекта, не рекомендуется. Если существует несколько двух интерфейсов, необходимо предоставить только один IDispatch интерфейс. Методы, доступные для обеспечения того, чтобы это было нести штрафы, такие как потеря функции или повышенная сложность кода. Разработчик, учитывая этот подход, должен тщательно взвешивать преимущества и недостатки.

Предоставление единого интерфейса IDispatch

Можно предоставить несколько двух интерфейсов для одного объекта, исходя из двух или более специализаций IDispatchImpl. Однако если клиенты могут запрашивать IDispatch интерфейс, необходимо использовать макрос COM_INTERFACE_ENTRY2 (или COM_INTERFACE_ENTRY_IID)), чтобы указать, какой базовый класс будет использоваться для реализации IDispatch.

COM_INTERFACE_ENTRY2(IDispatch, IMyDualInterface)

Так как предоставляется только один IDispatch интерфейс, клиенты, которые могут получить доступ только к объектам через IDispatch интерфейс, не смогут получить доступ к методам или свойствам в любом другом интерфейсе.

Объединение нескольких двойных интерфейсов в единую реализацию IDispatch

ATL не поддерживает объединение нескольких двух интерфейсов в одну реализацию IDispatch. Однако существует несколько известных подходов к ручному объединению интерфейсов, таких как создание шаблонного класса, содержащего объединение отдельных IDispatch интерфейсов, создание нового объекта для выполнения QueryInterface функции или использование реализации вложенных объектов на основе typeinfo для создания IDispatch интерфейса.

Эти подходы имеют проблемы с потенциальными конфликтами пространства имен, а также сложностью кода и удобством обслуживания. Не рекомендуется создавать несколько двух интерфейсов.

См. также

Сдвоенные интерфейсы и ATL