我是一名 Java 开发人员,最近不得不戴上 Delphi 开发人员的帽子。
在这种情况下通常会出现这种情况,我最终尝试在 Delphi 中做事,同时仍然使用我的“Java”思维方式,当它们不起作用时我感到困惑。
今天的主题是接口(interface)的概念。在 Java 中,我可以定义一个接口(interface),为其提供一些方法,然后声明一个实现该接口(interface)的类。
我曾尝试在 Delphi 中做同样的事情,结果我的手指被烫伤了。我声明了一个扩展 IInterface 的接口(interface)。但是当实现该接口(interface)时,我遇到了一些未实现的方法错误,这些错误是针对我未声明的方法(QueryInterface、_AddRef、_Release)。
一点 Google 告诉我,我需要扩展 TInterfacedObject 而不是 TObject。这让我感到不安,因为它表明我不能简单地向某个第三方类添加接口(interface),除非该类最终扩展了 TInterfacedObject。
但是现在,当设置我的接口(interface)对象 .Free 时,我遇到了 EInvalidPointer 异常。
因此,我开始得出结论,接口(interface)一词对于 Java 开发人员和 Delphi 开发人员的含义完全不同。
精通这两种语言的人可以告诉我它们之间的区别吗?
干杯。
最佳答案
Delphi 中的接口(interface)类型具有三个功能:
- 作为 Java 中的接口(interface)类型从实现中抽象接口(interface)的通用语言特性。
- 形成 Delphi 的 COM 支持的核心(Delphi
IInterface
与 COMIUnknown
相同)。 - 在非垃圾收集环境的上下文中提供一种自动内存管理形式。
这些函数在概念上是截然不同的,正如您所发现的,当组合在同一特征中时产生的结果不是最佳的:
- Delphi 中的每个接口(interface)最终都必须继承自
IInterface
/IUnknown
,因此,具有三个IUnknown
方法(AddRef
、Release
和QueryInterface
- 前两个在 Delphi 中重命名为_AddRef
和_Release
以阻止您从直接调用他们)。如果您希望能够在运行时查询某个界面,您还需要为其提供一个 GUID。 TInterfacedObject
作为一个方便的基类存在,但如果您实现了_AddRef
、_Release
和,则不必使用它>QueryInterface
自己(这样做涉及标准模式,所以并不难)。原则上,您还可以通过为前两个返回-1
来禁用引用计数(例如,TComponent
类就是这样做的)。- 尽管如此,当通过接口(interface)访问对象时,编译器总是插入
_AddRef
和_Release
调用。这使得通过对象和接口(interface)引用访问同一个对象经常是不安全的即使_AddRef
和_Release
只是返回-1
。
关于java - 比较和对比 Java 和 Delphi 中的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19099413/