COM接口版本控制与继承

4
为什么例如 IHTMLDocument3 没有继承 IHTMLDocument2?
为什么 IAnyMicrosoftInterface(N) 不继承 IAnyMicrosoftInterface(N-1)?
新接口只包含新函数,不会继承前面接口的函数。如果某个对象支持 ISomeInterface5,我能确定它也支持 ISomeInterface4 吗?我正在编写一些COM代码的封装器,我需要决定 html_document3 是否应该派生自 html_document2。
1个回答

2
为什么 IAnyMicrosoftInterface(N) 没有继承 IAnyMicrosoftInterface(N-1)
以下是相反的例子: IFilterGraph3 接口继承自 IFilterGraph2IFilterGraph3 还具有这些类型的成员:
或者 ID2D1Bitmap1 接口继承自 ID2D1BitmapID2D1Bitmap1 还具有这些类型的成员:
这是COM接口设计中的两种方法。两种方法都可以实现。通过这两个接口,新旧方法都可以访问(可能只能通过新接口)。如果选择继承,则在新接口上复制所有旧方法,而不需要旧接口。如果选择不继承,则可以重新定义某些方法,例如添加新参数,并且仍然可以使所有内容看起来良好。
“我能确定如果某个对象支持ISomeInterface5,它也支持ISomeInterface4吗?”
不一定。这可能正是新实现不会拖入太多遗留代码的关键所在。或者,设计师更喜欢在同一类上重用旧的/新的代码,以便由同一类支持旧和新实现。常规的COM规则适用于此:一个对象可能实现多个接口;您可以使用编程方式发现它们,如果明确承诺特定实现提供多个接口(特别是旧版本的正在发展的接口),则可以使用文档来做出接口可用性的假设。

我不明白。如果我不确定是否有IHTMLDocument2,那么拥有IHTMLDocument3有什么意义呢?因为最后一个包含基本功能,所以IHTMLDocument3不能单独使用。例如,如果没有保证支持基本的IFile,那么我怎么能使用ITextFile呢? - reinterpret_alexey
你是在一般情况下询问还是特别针对 IHTMLDocumentN 询问?一般来说,一旦你拥有了 IFooY,就可能或可能不需要 IFooX。然而,IHTMLDocument3仅添加新方法,因此假定旧内容也存在。只是这种情况并不总是如此。 - Roman R.
我只是想知道如何处理这样的接口。例如,不继承先前版本的接口。MSDN 真的很烂。文档页面顶部应明确写明:“如果对象支持 IHTMLDocumentN,则它支持所有先前的版本”。为什么要在没有此类警告的情况下从新接口中排除先前的功能? - reinterpret_alexey
不应该这样写。否则,它将对开发人员构成强制性限制,一旦发布就必须遵守。关于IHTMLDocument3,你只需假设IHTMLDocument2也在那里。这不必是一个普遍规则。 - Roman R.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接