Delphi和Lazarus(FPC)中接口实现的区别是什么?

7
我们有一个自定义组件的项目,目前在Lazarus和Delphi中运行正常。
我想在其中使用代码接口,但我对它们不是很熟悉。我想知道的是:Delphi和Lazarus接口的实现细节有什么不同?有些需要特别注意的地方吗?我需要编写不同的代码吗?
背景说明: 我认为这些组件可以从接口中受益,或者至少我将从中学到更多。例如,其中一个组件使用串口与许多不同的硬件进行通信。但用户应该只使用我们的组件来创建应用程序。因此,我们有该组件以及每个硬件的一个类,它们都从基类继承而来。在运行时,我们在组件内创建特定的类。
不确定是否需要最后这个解释,但如果需要的话,我可以写更多。

2
这里有一份关于FreePascal接口的基础阅读。作为一个非常快速的结论,我想说,如果你的目标平台是Windows,并且你将使用Windows COM架构(从IUnknown派生的接口),那么代码与Delphi没有区别,但对你的问题的答案应该更加复杂。 - TLama
“实现细节”是什么意思?听起来好像并不重要。重要的是,你能否编写出在两个编译器中都能够表达相同含义的代码,而不管每个编译器如何实现接口。 - David Heffernan
@TLama 谢谢。我会查看那些文本,或许会与 Embarcadero 文档进行比较。我的目标是在 Windows 平台上,这些接口最初只会在应用程序内部使用。我必须承认,我对这个主题并不了解。:| - EMBarbosa
并没有更清晰。抱歉。 - David Heffernan
@DavidHeffernan 没关系,英语不是我的母语。 :) 首先,让我们明白一点,当我说实现时,我并不是在谈论接口的实现(Class Implements IcxInterface),而是如何定义IcxInterface以便编译器能够理解。那么,在Delphi接口定义和Lazarus接口定义中有什么不同吗?这样更好吗? - EMBarbosa
显示剩余2条评论
1个回答

11
在Free Pascal中,接口类型取决于模式。基本上有COM或CORBA模式。COM是默认的,大致与Delphi兼容。CORBA是一个更简单的情况,没有引用计数。(因此也不会生成对引用计数函数的调用)。因此,FPC Corba接口就像IUnknown接口的假想祖先。
此外,有时候在释放接口方面存在一些差异。Delphi倾向于在过程或块结束时(在较大的过程中)保存减少引用计数,而FPC有时候会更早地释放它们,通常是在最后使用语句之后立即释放。这两种方式都是合法的实现选择,基于哪个范围用于临时变量。(仅在函数级别上,还是在更深层次的嵌套块中)
然而,当在一个过程中同时使用接口引用和对象引用可能在Delphi中“存活”,但在FPC中却不一定如此时,有时会暴露出隐藏的(不好的)代码假设。这是一个典型的案例,表明长期工作的代码不一定是正确的。只有在改变实现时才可能注意到隐藏的假设。

(后来添加:)请注意,您可以在*nix上使用COM样式。这主要是在调用引用计数例程时插入的,以区分两种接口类型。不管是哪个系统(COM、Corba还是仅在RTL中引用计数),这些调用都会被路由到。

请注意,我认为COM与Corba这两种接口类型的命名非常不恰当。实际上,Corba接口也是引用计数的,但传统上该引用计数是手动处理的,因为Java不支持以自动化方式处理外部处理的接口。

2021-11-06添加:看起来Delphi Alexandria现在也跟随这一趋势


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接