在Java和Delphi中比较和比较接口
我是一位Java开发人员,他最近被戴上了Delphi开发人员的帽子。
就像在这种情况下通常的情况一样,在我仍然使用我的'Java'思维模式的时候,我终于尝试在Delphi中做事情,当他们不工作时我感到困惑。
今天的问题是接口的概念。 在Java中,我可以定义一个接口,给它一些方法,然后声明一个实现该接口的类。
我试图在Delphi中做同样的事情,并且弄伤了我的手指。 我宣布了一个扩展IInterface的接口。 但是当实现这个接口的时候,我接触到了许多未声明的方法错误(QueryInterface,_AddRef,_Release)。
有一点Google告诉我需要扩展TInterfacedObject而不是TObject。 这让我感到不安,因为它暗示我不能简单地将接口添加到某些第三方类,除非该类最终扩展了TInterfacedObject。
但现在,当它变成设置接口对象的时候.Free,我得到了EInvalidPointer异常。
因此,我开始得出结论:接口这个词的意思与Java开发人员和Delphi开发人员完全不同。
能够熟练使用这两种语言的人能让我了解这些差异吗?
干杯。
Delphi中的接口类型有三个功能:
IInterface
与COM IUnknown
相同)。 这些功能在概念上是截然不同的,正如您所发现的那样,当将这些功能组合在同一个功能中时,产生的效果并不理想:
IInterface
/ IUnknown
下降,因此,有三个IUnknown
方法( AddRef
, Release
和QueryInterface
- 前两个在Delphi中被重命名为_AddRef
和_Release
,以防止您直接调用它们)。 如果您希望能够在运行时查询接口,则还需要为其提供一个GUID。 TInterfacedObject
作为一个方便的基类存在,但如果你自己实现_AddRef
, _Release
和QueryInterface
(这样做涉及标准模式,所以不难),但不必使用它。 原则上,您还可以通过为前两个返回-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