2012-03-06 201 views
6

我们有一个项目充满了今天在拉撒路和德尔福工作的定制组件。Delphi和Lazarus(FPC)的接口实现有什么区别?

我在想它的代码界面,但我不太熟悉它们。我想知道的是:Delphi和Lazarus接口的实现细节有哪些?有什么我应该特别注意的?我需要编写真正不同的东西吗?

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

不确定最后的解释是否需要,但如果您需要的话,我可以写更多。

+2

这是关于FreePascal中的接口的['basic reading'](http://www.freepascal.org/docs-html/ref/refchref.html#x84-940007)。作为一个非常快速的结论,我会说,如果你的目标是Windows平台,并且你将使用Windows COM架构(从IUnknown降序的接口),那么Delphi的代码没有什么区别,但是你的问题的答案应该更多复杂。 – TLama 2012-03-06 22:28:15

+0

“执行细微差别”是什么意思?它听起来不像是对你真正重要。不管你是否可以编写代码,这两个编译器都意味着相同的事情,而不管每个编译器如何实现接口。 – 2012-03-06 22:46:22

+0

@DavidHeffernan我的意思是“实施中的小差异”。也许我不能编写对两者都是相同的代码,但也许我不需要为每个编译器编写所有的代码。我刚刚问过我期望拥有的原因,但我不知道在这种情况下两个编译器是否有区别。现在更清楚了吗? – EMBarbosa 2012-03-06 23:08:43

回答

11

在Free Pascal中,接口类型取决于模式。基本上有COM or CORBA模式。 COM是默认的,并且与Delphi大致兼容。没有参考计算,CORBA是一个更简单的情况。 (因此也不会生成调用函数的调用)。所以基本上FPC Corba接口就像是IUnknown接口的假设祖先。

除此之外,接口发布时有时会有一些差异。德尔福倾向于节省在过程或块(在较大的过程中)结束时减少refcount,而FPC有时会知道更快地释放它们,通常在上次使用声明后立即释放。这两个都是合法的实现选择,基于哪个范围用于临时变量。 (只在函数级别上,或者在更深的嵌套块中)

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

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

请注意,我认为两种接口类型的COM和Corba名称都被严重选中。 Corba接口实际上被反编译,但传统上这个refcount是手动处理的,因为Java不支持自动处理外部接口。

+1

+1。这种信息真的很感谢。 – EMBarbosa 2012-03-09 14:29:25

相关问题