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

时间:2013-09-30 16:41:30

标签: java delphi interface

我是一名Java开发人员,最近被戴上了Delphi开发人员帽。

在这种情况下通常就是这种情况,我最终还是继续使用我的'Java'思维模式在Delphi中做事情,当他们不工作时我感到很困惑。

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

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

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

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

因此,我开始得出结论,接口这个词与Java开发人员和Delphi开发人员完全不同。

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

干杯。

2 个答案:

答案 0 :(得分:8)

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

  1. 是一种通用语言功能,用于从Java实现接口类型中抽象接口。
  2. 构成Delphi的COM支持的核心(Delphi IInterface与COM IUnknown相同)。
  3. 在非垃圾收集环境的上下文中提供自动内存管理的形式。
  4. 这些功能在概念上是截然不同的,正如您所发现的,当组合在同一个功能中时,会产生不太理想的结果:

    • Delphi中的每个接口都必须最终来自IInterface / IUnknown,因此,有三个IUnknown方法(AddRefRelease和{ {1}} - 前两个在Delphi中重命名为QueryInterface_AddRef,以阻止您直接调用它们。如果您希望能够在运行时查询接口,还需要为其指定GUID。
    • _Release作为方便的基类存在,但如果您自己实施TInterfacedObject_AddRef_Release,则不必使用它涉及标准模式,所以它并不难。原则上,您也可以通过返回前两个QueryInterface来禁用引用计数(例如,-1类执行此操作)。
    • 但是,当通过接口访问对象时,编译器将始终插入TComponent_AddRef调用。这使得通过对象和接口引用访问同一对象经常不安全,即使 _Release_AddRef只返回_Release

答案 1 :(得分:3)

区别在于垃圾收集器。 Java有一个。但是在Delphi中你必须自己控制你的对象。

_AddRef和_Release创建,使这一点变得简单。当变量开始指向您的对象时,Delphi会调用_AddRef。在那里你必须增加对该对象的引用的计数器。 当代码中的变量“松散”链接到对象时Delphi调用_Release。在那里你必须减少反击。当你的计数器变为0时,你可以为这个对象Self.Destroy()调用destroy()。

希望这有帮助。

PS。 TInterfacedObject已经实现了这些方法,这就是Google和Delphi文档建议使用TInterfacedObject的原因。