Управление версиями и наследование COM-интерфейса

Почему не IHTMLDocument3 например наследовать IHTMLDocument2? Почему не IAnyMicrosoftInterface(N) унаследовать IAnyMicrosoftInterface(N-1)?

Новые интерфейсы просто содержат только новые функции, но они не наследуют функции предыдущего интерфейса. Могу ли я быть уверен, что если какой-то объект поддерживает ISomeInterface5 тогда он также поддерживает ISomeInterface4? Я пишу некоторые обертки для кода COM, и мне нужно решить, например, будет ли html_document3 получен из html_document2.

1 ответ

Почему не IAnyMicrosoftInterface(N) унаследовать IAnyMicrosoftInterface(N-1)?

Вот вам примеры противоположного:

IFilterGraph3 интерфейс наследуется от IFilterGraph2 , IFilterGraph3 также имеет следующие типы членов:

Или же

ID2D1Bitmap1 интерфейс наследуется от ID2D1Bitmap , ID2D1Bitmap1 также имеет следующие типы членов:

Это два подхода в дизайне COM-интерфейсов. Это может работать в обоих направлениях. В обоих случаях все новые и старые методы доступны через оба интерфейса (и, возможно, только через новый интерфейс). Если вы решите наследовать, вы в основном дублируете все старые методы на новом интерфейсе, и одному вообще не нужен старый интерфейс. Если вы решите не наследовать, вы получите возможность переопределить определенные методы, например, чтобы добавить новые параметры и сделать так, чтобы все вместе выглядело хорошо.

Могу ли я быть уверен, что если какой-либо объект поддерживает ISomeInterface5, то он также поддерживает ISomeInterface4?

Нет. Это может быть как раз тот факт, что более новая реализация не тянет слишком много унаследованных вещей. Или разработчик предпочитает повторно использовать старый / более новый код в одном и том же классе так, как старая и новая реализация поддерживаются одним и тем же классом. Здесь применяются обычные правила COM: объект может реализовывать множество интерфейсов; вы QueryInterface обнаруживать их программно, и вы делаете предположения о доступности интерфейса, используя документацию на случай, если четко обещано, что конкретная реализация предлагает несколько интерфейсов, особенно например, более старая версия развивающегося интерфейса.

Другие вопросы по тегам