在Java和Delphi中比较和比较接口

我是一位Java开发人员,他最近被戴上了Delphi开发人员的帽子。

就像在这种情况下通常的情况一样,在我仍然使用我的'Java'思维模式的时候,我终于尝试在Delphi中做事情,当他们不工作时我感到困惑。

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

我试图在Delphi中做同样的事情,并且弄伤了我的手指。 我宣布了一个扩展IInterface的接口。 但是当实现这个接口的时候,我接触到了许多未声明的方法错误(QueryInterface,_AddRef,_Release)。

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

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

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

能够熟练使用这两种语言的人能让我了解这些差异吗?

干杯。


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

  • 成为一个通用的语言特征,用于从Java中实现接口类型的接口。
  • 构成Delphi COM支持的核心(Delphi IInterface与COM IUnknown相同)。
  • 在非垃圾回收环境中提供一种自动内存管理形式。
  • 这些功能在概念上是截然不同的,正如您所发现的那样,当将这些功能组合在同一个功能中时,产生的效果并不理想:

  • Delphi中的每个接口必须最终从IInterface / IUnknown下降,因此,有三个IUnknown方法( AddRefReleaseQueryInterface - 前两个在Delphi中被重命名为_AddRef_Release ,以防止您直接调用它们)。 如果您希望能够在运行时查询接口,则还需要为其提供一个GUID。
  • TInterfacedObject作为一个方便的基类存在,但如果你自己实现_AddRef_ReleaseQueryInterface (这样做涉及标准模式,所以不难),但不必使用它。 原则上,您还可以通过为前两个返回-1来禁用引用计数(例如, TComponent类执行此操作)。
  • 尽管如此,当通过接口访问对象时,编译器总是会插入_AddRef_Release调用。 这使得通过对象和接口引用访问同一个对象通常是不安全的,即使当_AddRef_Release返回-1

  • 不同之处在于垃圾收集器。 Java有一个。 但在Delphi中,你必须自己控制你的对象。

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

    希望这可以帮助。

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

    链接地址: http://www.djcxy.com/p/16171.html

    上一篇: Compare and contrast interfaces in Java and Delphi

    下一篇: Is there an easy way to work around a Delphi utf8