java - 比较和对比 Java 和 Delphi 中的接口(interface)

标签 java delphi interface

我是一名 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)类型具有三个功能:

  1. 作为 Java 中的接口(interface)类型从实现中抽象接口(interface)的通用语言特性。
  2. 形成 Delphi 的 COM 支持的核心(Delphi IInterface 与 COM IUnknown 相同)。
  3. 在非垃圾收集环境的上下文中提供一种自动内存管理形式。

这些函数在概念上是截然不同的,正如您所发现的,当组合在同一特征中时产生的结果不是最佳的:

  • Delphi 中的每个接口(interface)最终都必须继承自 IInterface/IUnknown,因此,具有三个 IUnknown 方法(AddRef ReleaseQueryInterface - 前两个在 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/

相关文章:

forms - 如何为具有 gin(框架)和 golang 接口(interface)的表单制作通用表单函数?

java - 接口(interface)方法参数数组与 util 列表

Java 8 - 切换窗口后丢失所有键盘输入或焦点

java - 扩展可以是 has-a 关系吗?

windows - .text 和 .itext 内存段有什么区别?

delphi - 如何将 TObjectList 用于任意类类型?

.net - 重新指定已经继承的接口(interface)有什么意义吗?

java - 我应该在我的 java 持久性项目中调用 System.gc() 吗?

java - 如何获取警报对话框中的列表?

java - Delphi 中通过 Java Bridge 使用 DocumentBuilderFactory 时出现段错误