【问题标题】:What are the differences between implementation of Interfaces in Delphi and Lazarus (FPC)?Delphi 和 Lazarus (FPC) 中的接口实现有什么区别?
【发布时间】:2012-03-24 11:02:23
【问题描述】:

我们有一个充满自定义组件的项目,目前在 Lazarus 和 Delphi 中运行。

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

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

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

【问题讨论】:

  • 这里是basic reading 关于 FreePascal 中的接口。作为一个非常快速的结论,我会说,如果您的目标是 Windows 平台并且您将使用 Windows COM 架构(接口源自 IUnknown),那么 Delphi 的代码将没有区别,但您的问题的答案应该更多复杂。
  • “实施细微差别”是什么意思?听起来这对你来说并不重要。重要的是您是否可以编写对两个编译器意味着相同的代码,而不管每个编译器如何实际实现接口。
  • @DavidHeffernan 我的意思是“实施中的细微差别”。也许我不能编写对两者都意味着相同的代码,但也许我不需要为每个编译器编写所有东西。我问只是因为我希望有,但我不知道在这种情况下两个编译器是否有任何区别。现在清楚了吗?
  • @TLama 谢谢。我将查看该文本,并可能与 embarcadero 文档进行比较。我的目标是 Windows,这些接口一开始只会在应用程序内部使用。我必须承认我对这个话题了解不多。 :|
  • 不是很清楚。对不起。

标签: delphi interface freepascal lazarus


【解决方案1】:

在 Free Pascal 中,接口类型取决于模式。基本上有模式COM or 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 now follows suit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 2016-02-07
    • 2014-03-15
    • 2019-10-16
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多