【问题标题】:Functions without interface [closed]没有接口的功能[关闭]
【发布时间】:2013-10-01 09:36:13
【问题描述】:

以下看起来语法正确并且编译良好。

unit MyAPI;

interface
// function Min(X, Y: Integer): Integer;
// function Max(X, Y: Integer): Integer;

implementation

function Min(X, Y: Integer): Integer;
begin
  if X < Y then Min := X else Min := Y;
end;

function Max(X, Y: Integer): Integer;
begin
  if X > Y then Max := X else Max := Y;
end;

end.

我想为另外 50 个函数做同样的事情,通常是我正在构建的动态库的外观函数。这 50 个函数的主体都很小,只需调用内部代码,然后通过输出 DLL 将数据转换为 C 风格调用。

出于这个原因,我想让编写界面部分变得经济。

unit MyAPI;

interface
uses Optimizer;

implementation

function Min(X, Y: Integer): Integer;
var
  optimizer: TOptimizer;
begin
  optimizer := TOptimizer.Create;
  Min := optimizer.Min(X,Y);
end; stdcall;

...

end.

这是好的还是不好的做法?我还有哪些其他选择?

【问题讨论】:

  • 那你是说不想写接口代码?没关系,这只是意味着这些函数在定义它们的单元之外是不可见的。
  • MinMax 已在 Math 单元中声明。尽量避免重复 RTL 实用程序。
  • @LURD - 我猜这是展示这个概念的一个例子。
  • 在您的第二个代码示例中,如果可能,您应该将 Min 设为类函数,这样您就不必创建 TOptimizer 的实例。
  • 我在这里看不到问题。我不明白为什么标题指的是inline。这里没有内联。请编辑以明确您的要求。

标签: delphi interface


【解决方案1】:

除了第二个例子中明显的内存泄漏(没有破坏变量optimizer),主要根据你的要求,在接口部分声明函数与否是有区别的。

未在接口部分声明的函数只能在同一单元内使用,不能从使用该单元的其他单元调用。

接口部分中声明的函数可以在单元外使用。

这不是节省线路的问题,两个选项在语义上是不同的,这是一个决定是否向外界隐藏功能。

【讨论】:

  • 问题中的所有函数都返回值。您可以使用扩展语法中的Result 或使用函数名称来分配给隐式函数返回变量。
  • 哎呀没有看到 Min 是函数的名称...正在编辑
  • 感谢您的回答。我不明白为什么会有内存泄漏。我显然不是 Delphi 专家,但它似乎类似于 C++ 在堆栈上分配内存的概念(对象在 Min 函数结束时自动死亡)。看看他们如何在这个例子中使用 Create 关键字。 delphibasics.co.uk/RTL.asp?Name=Constructor还是我错了?
  • @John - Delphi 永远不会假设对象超出了您的范围,您需要明确地 .free 它们,最好在 try..finally 块中。唯一的例外是接口
  • 正如@Matt 所指出的,Delphi 没有用于对象的垃圾收集器(仅对接口进行引用计数),并且每个构造都应遵循销毁,因此非常推荐不要返回在函数中创建的对象的实例(构造函数除外)并且(几乎)总是尝试在与销毁相同的代码块中进行构造。当心,C++ 也有同样的问题,只有当所有引用它的变量超出范围时,垃圾收集(Java、C#、python 等)的语言才会释放对象。
【解决方案2】:

interfaceimplementation 部分的含义截然不同。简而言之 - 实现是实际的代码,它需要让它运行所需的任何东西。显然,没有实现的代码是行不通的:)

interface 部分是单位中其他单位可以看到和使用的部分。 如果您的整个程序是一个单元,那么绝对不需要 interface 定义。

如果您需要在单元外部使用您的代码,正如您所暗示的(动态库的外观函数),您应该在 interface 部分中列出这些函数。

如果您了解面向对象的概念,这类似于私有/公共定义。 interface 中声明的所有内容都是公开的,而其他所有内容都是私有的。 interface/implementation 分离或多或少是穷人的封装。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    相关资源
    最近更新 更多