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

EMB*_*osa 7 delphi interface freepascal lazarus

我们有一个充满了定制组件的项目,现在在Lazarus和Delphi中工作.

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

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

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

Mar*_*ort 11

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

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

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

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

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