Несколько сдвоенных интерфейсов
Вы можете объединить преимущества двойного интерфейса (т. е. гибкость как 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
интерфейса.
Эти подходы имеют проблемы с потенциальными конфликтами пространства имен, а также сложностью кода и удобством обслуживания. Не рекомендуется создавать несколько двух интерфейсов.