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