以下看起来语法正确并且编译得很好。
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.
这是好的还是不好的做法?我还有其他选择吗?
答案 0 :(得分:3)
除了第二个例子中明显的内存泄漏(没有破坏变量optimizer
),主要基于你的要求,在接口部分声明函数之间是否有区别。
未在接口部分声明的功能只能在同一单元中使用,不能使用该单元从其他单元调用。
在接口部分声明的函数可以在单元外部使用。
这不是节约线路的问题,两种选择在语义上都是不同的,并且决定是否将功能隐藏到外部世界。
答案 1 :(得分:3)
interface
和implementation
部分的含义非常明显。简而言之 - 实现是实际的代码,它需要使其运行所需的一切。显然,未实现的代码不起作用:)
interface
部分是其他单位可以看到和使用的单位的一部分。
如果您的整个程序是一个单元,那么绝对不需要interface
定义。
如果您需要使用设备外部的代码,正如您所暗示的那样(动态库的façade函数),您应该在interface
部分列出这些函数。
如果您了解面向对象的概念,这类似于私有/公共定义。 interface
中声明的任何内容都是公开的,而其他所有内容都是私有的。 interface
/ implementation
分离或多或少是穷人的封装。