Compare and contrast interfaces in Java and Delphi
我是一名Java开发人员,最近一直戴着Delphi开发人员的帽子。
在这种情况下通常就是这种情况,我最终尝试在Delphi中做事情,同时仍然使用我的"Java"思维模式,当他们不工作时我会感到困惑。
今天的问题是界面的概念。在Java中,我可以定义一个接口,给它一些方法,然后声明一个实现该接口的类。
我试图在Delphi中做同样的事情,并且我的手指被烧了。我声明了一个扩展IInterface的接口。但是当实现该接口的时候,我没有声明的方法(QueryInterface,_AddRef,_Release)受到了许多未实现的方法错误的欢迎。
一个小谷歌告诉我,我需要扩展TInterfacedObject而不是TObject。这让我感到不安,因为它表明我不能简单地将接口添加到某些第三方类,除非该类最终扩展了TInterfacedObject。
但现在,当它成为设置我的接口对象的时候.Free,我得到了EInvalidPointer异常。
结果,我开始得出结论,接口这个词意味着与Java开发人员和Delphi开发人员完全不同。
精通这两种语言的人能不能告诉我这些差异?
干杯。
Delphi中的接口类型有三个功能:
这些函数在概念上是截然不同的,正如您所发现的,当组合在同一个特征中时,产生的结果不是最佳:
-
Delphi中的每个接口必须最终从
IInterface /IUnknown 下降,因此,有三个IUnknown 方法(AddRef ,Release 和QueryInterface - 前两个重命名为_AddRef 和<在Delphi中x10>阻止你直接调用它们。如果您希望能够在运行时查询接口,还需要为其指定GUID。 -
TInterfacedObject 作为方便的基类存在,但如果您自己实现_AddRef ,_Release 和QueryInterface ,则不必使用它(这样做涉及标准模式,因此并不难)。原则上,您也可以通过返回前两个-1 来禁用引用计数(例如,TComponent 类执行此操作)。 -
尽管如此,当通过接口访问对象时,编译器将始终插入
_AddRef 和_Release 调用。这使得通过对象和接口引用访问同一对象经常是不安全的,即使_AddRef 和_Release 只返回-1 。
不同之处在于垃圾收集器。 Java有一个。但是在Delphi中你必须自己控制你的对象。
_AddRef和_Release创建使这一点变得简单。当变量开始指向您的对象时,Delphi会调用_AddRef。在那里你必须增加对该对象的引用的计数器。
当代码中的变量"松散"链接到对象时Delphi调用_Release。在那里你必须减少反击。当你的计数器变为0时,你可以为这个对象
希望这可以帮助。
PS。 TInterfacedObject已经实现了这些方法,这就是Google和Delphi文档建议使用TInterfacedObject的原因。