2013-10-01 50 views
0

以下语法看起来正确,并且编译正确。无界面功能

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. 

这是行不行?我还有什么其他选择?

+5

那么你是说你不想写接口代码?这很好,它只是意味着这些函数在它们定义的单元之外是不可见的。 –

+0

'Min'和'Max'已经在'Math'单元中声明。尽量避免重复RTL实用程序。 –

+1

@LURD - 我猜这是一个展示这个概念的例子。 –

回答

3

除了第二个例子中明显的内存泄漏(不会损坏变量optimizer),主要基于您所要求的内容,在接口部分中声明函数与否有区别。

未在界面部分声明的功能只能在同一单元内使用,不能从使用该单元的其他单元调用。

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

这不是一个节约生产线的问题,两个选项在语义上都是不同的,它决定将功能隐藏到外部世界。

+1

问题中的所有函数都返回值。您可以使用扩展语法中的“Result”或使用函数名称来指定隐式函数返回变量。 –

+0

哎呀,没有看到Min是这个函数的名字......编辑 – Qsebas

+0

谢谢你的回答。我不明白为什么会有内存泄漏。 我显然不是德尔福的专家,但它似乎类似于在堆栈上分配内存的C++概念(对象在Min函数结束时自动死亡)。看看他们在这个例子中如何使用Create关键字。 http://www.delphibasics.co.uk/RTL.asp?Name=Constructor 还是我错了? –

3

interfaceimplementation部分的含义十分明显。简而言之 - 实现是实际的代码,它需要使其运行所需的任何内容。很显然,未实现的代码将无法工作:)

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

如果您需要从设备外部使用您的代码,就像您暗示的那样(动态库的外观功能),您应该在interface部分列出这些功能。

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