什么是 C (COM) 中的接口,它与 C# 中的接口相同吗?

Posted

技术标签:

【中文标题】什么是 C (COM) 中的接口,它与 C# 中的接口相同吗?【英文标题】:What is an interface in C (COM) is it the same as a interface in C# 【发布时间】:2010-05-31 23:31:33 【问题描述】:

好的,我知道什么是接口,但是自从我接触到 C 并使用 COM 对象(组件对象模型)后,COM 中的接口似乎与我所知道的接口有点不同。

所以我要做的就是弥补这里的差距,因为自从我学习 C 以来,很多事情对我来说听起来很熟悉,但并不完全是它们看起来的样子。

我知道的界面就像合约。它们是只有方法声明的对象,没有主体。所有实现接口的类都必须包含接口的方法。

我在 COM 中听到的接口似乎只是指针。它们不能直接检索对象,只能通过方法来检索对象。这就是COM接口吗??如果是这样,那么如果它们完全不同,为什么要给它们起相同的名字。

另外,我只是想在 C++ 中添加这些标头,这让我想起了 C# 接口。不确定他们是否有任何关系。但无论如何,我只是想澄清这一点。

【问题讨论】:

你的意思是“C++”所有你输入的地方都只是“C”吗? C中没有接口。 我猜他的意思是“C++”,因为他说他刚接触 C++.. 好吧,我想说的是 C++,但我指的是 COM 中的接口。我认为这一切都在 C 中 不,他不是指 C++。您可以从 C 中调用 COM 对象。但很难知道从哪里开始回答他的问题。 【参考方案1】:

我知道的界面是这样的 合同。它们是具有 只有方法声明,没有 身体。所有实现的类 接口必须包含以下方法 界面。

C# 接口在 C++ 中是一个空的抽象类。

【讨论】:

我更新了问题。我的意思是在 COM(组件对象模型)中【参考方案2】:

术语接口通常只是软件开发中某种“合同”的概念。由于 C 没有内置的面向对象(它是一种过程语言),因此术语“接口”的含义与 Java 中的不同,例如,它们作为一种语言结构具有特殊的含义。 在 C++ 中也没有明确的接口关键字/语言结构,但您可以通过定义纯抽象类(仅包含纯虚方法的类)来获得类似的语义。

C++ 中的“接口”示例:

class Comparable 
public:
  virtual int compareTo(Comparable const * const other) const = 0; // <- the "= 0" indicates a _pure_ virtual method 
;

【讨论】:

好吧,我想我说的是在 COM 中。就像不知道一样。【参考方案3】:

它们肯定有一些共同的低级细节。接口是两种语言的函数指针列表。更常见的是在 C++ 中实现,因为大多数编译器已经将虚函数实现为“v-table”。与 COM 调度表一对一匹配。

他们开始分歧的地方是 IUnknown 的方法。 COM 接口具有 AddRef 和 Release 方法来管理内存,使用引用计数。在 C# 中不是问题,因为垃圾收集器会处理它。

而且 COM 不支持继承。在 C# 中不是问题,如果要获取接口指针,则只需转换对象引用。它必须在 COM 中使用 IUnknown::QueryInterface() 方法显式完成。 COM 中有一些对对象重用的支持,通过聚合来实现。它是如此迟钝,以至于很少有人实现它。

【讨论】:

“而且 COM 不支持继承”是什么意思? COM 在接口级别支持单一继承。你的意思是它不支持某种继承风格还是什么? 不行,它聚合了“base”接口的方法,都得重新实现。 C++确实支持继承,使得实现接口变得更加容易。

以上是关于什么是 C (COM) 中的接口,它与 C# 中的接口相同吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 C++ 加载的 C# DLL 中的异常

c#关于接口

同一个 COM 库中的 C++ 和 c# 类

c#之委托详解

C# 枚举器和可枚举类型

C# 4.0 中的“动态”类型是做啥用的?