C++ OO语言中的继承与句柄

C++ OO语言中的继承与句柄,c++,oop,C++,Oop,接口和句柄之间有什么区别 句柄-实现在另一个类中(句柄:公开一个类的所有功能,但实际实现在另一个类中编码。句柄包含指向实现类的指针(pimpl习语)。句柄类似于包装类。) 接口-实现在派生类中 这是唯一的区别吗 我们在哪里使用接口,在哪里使用句柄?C++既不包含接口也不包含句柄的概念,因此在这种语言中,从技术上讲,说它们就是您所使用的 也就是说,听起来你的概念有些混乱(事实上没有权威的定义肯定没有帮助) 通常,句柄是一种唯一描述对象的值,但持有句柄的人不知道它这样做的方式。相反,有一些第三方知道

接口和句柄之间有什么区别

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

接口-实现在派生类中

这是唯一的区别吗


我们在哪里使用接口,在哪里使用句柄?

C++既不包含接口也不包含句柄的概念,因此在这种语言中,从技术上讲,说它们就是您所使用的

也就是说,听起来你的概念有些混乱(事实上没有权威的定义肯定没有帮助)

通常,句柄是一种唯一描述对象的值,但持有句柄的人不知道它这样做的方式。相反,有一些第三方知道如何从句柄到实际对象再返回,持有人需要访问实际对象时必须通过该实体。这正是句柄的基本原理(从第三方的角度来看):除非您知道,否则您不希望其他人弄乱您的对象,因此您将它们隐藏在不透明句柄后面

尝试定义接口比较困难,因为根据上下文,有许多好的候选接口:

  • 我们可以说,类的接口是其公共方法及其签名的集合;如果给你一个类的实例,你就必须使用它
  • 我们还可以说,一个只有
    公共虚拟
    方法且没有数据成员的类是一个接口,因为它在两个实体之间建模了一个契约(“您只允许调用此方法,但当您这样做时,我保证会这样响应”)

如果你想得到一个更具体的答案,你必须先向自己澄清这个问题,然后再向我们其他人澄清。C++既不包含接口也不包含句柄的概念,因此在这种语言中,明确地说它们是你所理解的,这在技术上是正确的

也就是说,听起来你的概念有些混乱(事实上没有权威的定义肯定没有帮助)

通常,句柄是一种唯一描述对象的值,但持有句柄的人不知道它这样做的方式。相反,有一些第三方知道如何从句柄到实际对象再返回,持有人需要访问实际对象时必须通过该实体。这正是句柄的基本原理(从第三方的角度来看):除非您知道,否则您不希望其他人弄乱您的对象,因此您将它们隐藏在不透明句柄后面

尝试定义接口比较困难,因为根据上下文,有许多好的候选接口:

  • 我们可以说,类的接口是其公共方法及其签名的集合;如果给你一个类的实例,你就必须使用它
  • 我们还可以说,一个只有
    公共虚拟
    方法且没有数据成员的类是一个接口,因为它在两个实体之间建模了一个契约(“您只允许调用此方法,但当您这样做时,我保证会这样响应”)
如果你想得到更具体的答案,你首先必须先澄清你自己的问题,然后再与其他人一起澄清。

句柄在C++方面没有广泛的一致意义。不同的人使用它来表示完全不同的东西(例如,在Windows上,“句柄”确实有一个相当明确的含义,所以人们在C++中编程窗口往往倾向于使用Windows的方式。” 至于在另一个类中的实现,这听起来更像是一个pimpl,而不是大多数人通常所说的句柄。如果这是您正在谈论的事情,那么它在实现和使用方面都与继承有很大的不同。事实上,在许多方面它是相反的:继承允许彼此不同的类被视为相同的类。使用pimpl,您有两个相同(在某些方面)的类,但您仍然将它们完全分开

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

pimpl通常主要用作编译器防火墙——如果您有一些经常更改的代码,但又不想在每次更改时重新编译依赖于它的所有内容,pimpl可能会有所帮助(但肯定不是万灵药)

句柄通常用于表示不透明的数据类型——一种“神奇的cookie”,它允许您访问某些功能,但您根本无法/根本无法查看或操作这些功能。在某种程度上,您可以将任何引用/指针视为几乎任何类(作为一种句柄),但听到或看到使用该术语的术语是非常不寻常的。更常见的情况是,它类似于C语言中的
文件*
——当您调用
fopen
时,它会给出
文件*
。任何时候,只要您想对打开的手柄进行操作,您就可以将相同的
文件*
传递回要使用的函数。但是,您永远不应该查看“内部”以查看它指向什么、如何使用它,或者其他任何内容(在Unix级别使用open/lseek/lread等,文件描述符的方式几乎相同)

也许你正在考虑一些比较接近C++早期流行的句柄/身体习语。在这个成语中,有di