比较和对比Java和Delphi中的接口

spi*_*epf 5 java delphi interface

我是一名Java开发人员,最近一直戴着Delphi开发人员的帽子.

在这种情况下通常就是这种情况,我最终尝试在Delphi中做事情,同时仍然使用我的"Java"思维模式,当他们不工作时我会感到困惑.

今天的问题是界面的概念.在Java中,我可以定义一个接口,给它一些方法,然后声明一个实现该接口的类.

我试图在Delphi中做同样的事情,并且我的手指被烧了.我声明了一个扩展IInterface的接口.但是当实现该接口的时候,我没有声明的方法(QueryInterface,_AddRef,_Release)受到了许多未实现的方法错误的欢迎.

一个小谷歌告诉我,我需要扩展TInterfacedObject而不是TObject.这让我感到不安,因为它表明我不能简单地将接口添加到某些第三方类,除非该类最终扩展了TInterfacedObject.

但现在,当它成为设置我的接口对象的时候.Free,我得到了EInvalidPointer异常.

结果,我开始得出结论,接口这个词意味着与Java开发人员和Delphi开发人员完全不同.

精通这两种语言的人能不能告诉我这些差异?

干杯.

Chr*_*ton 8

Delphi中的接口类型有三个功能:

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

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

  • 在Delphi中的每个接口必须最终从下降IInterface/ IUnknown,正因为如此,有三个IUnknown方法(AddRef,Release以及QueryInterface-前两个被重命名_AddRef,并_Release在德尔福从直接调用而气馁).如果您希望能够在运行时查询接口,还需要为其指定GUID.
  • TInterfacedObject作为一个方便的基类存在,虽然如果你实现你不必使用它_AddRef,_Release而QueryInterface你自己(这样做涉及标准模式,所以它并不难).原则上,您也可以通过返回-1前两个来禁用引用计数(TComponent例如,类执行此操作).
  • 尽管如此,当通过接口访问对象时,编译器将始终插入_AddRef并_Release调用.这使得经常不安全通过对象和接口引用访问相同的对象,即使 _AddRef与_Release刚刚返回-1.