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

时间:2012-03-06 22:04:13

标签: delphi interface freepascal lazarus

我们有一个充满了自定义组件的项目,现在可以在Lazarus和Delphi中使用。

我正在考虑代码接口,但我对它们并不熟悉。我想知道的是:Delphi和Lazarus接口的实现细微差别是什么?有什么我应该特别注意的吗?我是否需要编写真正不同的代码?

背景说明: 我认为组件可以从界面中受益,或者至少,我会从中学到更多。例如,其中一个组件使用串行端口与许多不同的硬件进行通信。但是用户应该只使用我们的组件来创建应用程序。因此,我们为每个从基类继承的硬件提供了组件和一个类。在运行时,我们在组件内创建特定的类。

不确定最后的解释是否需要,但如果你们有人需要,我可以写更多。

1 个答案:

答案 0 :(得分:11)

在Free Pascal中,接口类型取决于模式。基本上有模式COM or CORBA 。 COM是默认的,与Delphi大致兼容。 CORBA是一个更简单的案例,没有引用计数。 (因此也不会产生对引用计数功能的调用)。所以基本上FPC Corba接口就像IUnknown接口的假设祖先。

除此之外,接口发布时有时会有一些差异。 Delphi倾向于在过程或块的结束时(在较大的过程中)保存减少refcount,而FPC有时会更早地释放它们,通常在最后一次使用的声明之后立即释放它们。两者都是合法的实施选择btw,基于哪个范围用于临时变量。 (仅在功能级别,或者在更深的嵌套块中)

然而,这有时会在代码中显示隐藏(坏)假设,特别是在一个过程中使用接口引用和对象引用时可能在Delphi中“存活”但在FPC中不存在。这是一个典型的案例,表明长期工作代码不一定正确。人们可能只会在更改实施时注意到隐藏的假设

(稍后添加:)请注意,您可以在* nix上使用COM样式。它主要是插入对引用计数例程的调用,将两个接口类型分开。不是那些系统(COM,Corba或简单地在RTL引用计数中)将这些调用路由到。

请注意,我认为两种接口类型的COM vs Corba名称都选择得很糟糕。 Corba接口实际上是重新计算的,但传统上这个refcount是手动处理的,因为Java不支持自动处理外部处理的接口。