OOP语言中的继承与句柄

时间:2012-03-16 17:39:00

标签: c++ oop

接口和句柄之间的区别是什么

句柄 - 实现在另一个类中(句柄:公开类的所有功能,但实际的实现是在另一个类中编码的。句柄包含指向实现类的指针(pimpl idiom)。句柄就像一个包装类。 )

接口 - 实现在派生类

这是唯一的区别吗?

我们在哪里使用Interface,我们在哪里使用Handle?

2 个答案:

答案 0 :(得分:3)

C ++不包含接口或句柄的概念,所以特别是在这种语言中,说它们就是你所做的那样在技术上是正确的。

那就是说,听起来你的概念有些混淆(事实上没有权威的定义肯定没有用)。

通常,句柄是一种唯一描述对象的值,但是持有句柄的人不知道它的执行方式。相反,有一些第三方知道如何从句柄转到实际对象并返回,持有者必须在需要访问实际对象时通过该实体。这正是句柄的基本原理(从第三方的角度来看):你不希望别人弄乱你的对象,除非你知道它,所以你把它们隐藏在不透明的句柄后面。

尝试定义界面更加困难,因为有许多好的候选者,具体取决于上下文:

  • 我们可以说类的接口是它的公共方法及其签名的集合;如果您获得该类的实例
  • ,那就是您必须使用的内容
  • 我们还可以说,只有public virtual方法且没有数据成员的类是一个接口,因为它模拟了两个实体之间的合同(“只允许你调用此方法,但是当你这样做时,我保证会像这样回复“)

如果你想要一个更具体的答案,你必须首先用自己和我们其他人澄清这个问题。

答案 1 :(得分:1)

“句柄”与C ++没有广泛认可的含义。不同的人用它来表示完全不同的东西(例如,在Windows上,“句柄”确实具有相当明确的含义,因此用C ++编程Windows的人倾向于像Windows一样使用它。)

就另一个类的实现而言,这听起来更像是一个pimpl而不是大多数人通常称之为句柄的。如果这就是你所讨论的那种东西,它与实现和使用中的继承有很大的不同。事实上,在许多方面它恰恰相反:继承允许将彼此不同的类视为相同。使用pimpl,你有两个相同的类(在某些方面),但你仍然将它们完全分开。

关于使用它们的位置/原因:使用接口(通常是ABC,在C ++中),您允许通过现有接口操作新的派生类,因此现有代码可以使用您的新代码,而不需要修改现有代码这样做。

pimpl通常主要用作编译器防火墙 - 如果你有一些代码经常更改,但你不想每次更改它时重新编译依赖它的所有内容,那么pimpl可能会有所帮助(虽然绝对不是灵丹妙药。)

句柄通常用于表示不透明的数据类型 - 一种“魔术cookie”,可让您访问某些功能,但您根本不能/不能直接查看或操作。在某种程度上,您可以将几乎任何类的任何引用/指针视为句柄(排序),但听到/看到这样使用的术语是非常不寻常的。更常见的是,它类似于C中的FILE * - 当您致电fopen时,它会为您提供FILE *。无论何时你想对你打开的句柄进行操作,你都会将同样的FILE *传递给你将要使用的函数。但是,你不应该看起来“内部”看它指向什么,如何使用,或其他任何东西(在Unix级别使用open / lseek / lread等,文件描述符是几乎一样的方式)。

也许你正在考虑一些与相对较早的C ++中流行的句柄/正文习惯有关的东西。在这个成语中,你确实在另一个类中实现了。具体来说,“句柄”通常提供引用计数,而主体则在您拥有这些多个(计数)引用的单个项目上需要执行任何操作。句柄“处理”引用计数,并将几乎所有其他内容传递给实现类。这种用法不再常见,原因很简单,因为引用计数已大部分失宠。特别是在多线程环境中,引用计数可以(并且经常会)具有相当大的速度惩罚,因此它的使用现在相对不常见(在某一时间,几乎可以预期大多数类可能管理大量数据)。