如何在Delphi中使用Unit文件

时间:2009-04-03 16:48:02

标签: delphi private pascal public delphi-units

我只是试图抓住单独的单元来使我的代码更加封装。 我正在尝试将我的方法的公共/私有声明整理出来,因此我可以从使用testunit的其他单元中调用它们。在此示例中,我想将hellofromotherunit设为公开,但stickletters为私有。

unit testunit;    

interface

uses
  Windows, Messages, Dialogs;    

implementation

function stickletters(a,b:string):string;
begin
  result:=a+b;
end;

procedure hellofromotherunit();
begin
 showmessage(stickletters('h','i'));
end;

end.

我似乎无法从其他单位复制私人/公共结构,如:

Type
private
function stickletters(a,b:inter):integer;
public
procedure hellofromotherunit();
end

4 个答案:

答案 0 :(得分:6)

单位结构看起来有点像对象的公共/私人部分,你可以说这是他们的先行者。但语法不同。

您只需在接口部分声明方法标题,如:

interface
  procedure hellofromotherunit();

implementation
  procedure hellofromotherunit(); begin .. end;

每个部分只允许其中一个。

答案 1 :(得分:5)

私人&公开仅适用于类。

您要做的是将hellofromotherunit声明的副本放入接口部分。但是,请不要在那里贴上简报的声明副本。

界面部分中出现的任何内容都是公开的。任何仅在实施中失败的东西都是私有的。

答案 2 :(得分:1)

此外,

每个单元有两个不同的部分。界面和实现。

接口部分包含所有公共定义(类型,过程标题,常量)。实现部分包含所有实现细节。

当您使用单位时(使用uses子句),您可以访问该单位的公共定义。此访问不是递归的,因此如果单元A接口使用单元B,而单元C使用单元A,则除非明确使用单元B,否则不能访问单元B.

实现部分可以访问接口,以及两个uses子句中使用的单元(接口和实现)。

在继续编译其余单元之前,先编译已使用单元的接口。这样做的好处是,您可以在实现中具有循环依赖关系:

unit A;
interface
uses B;

unit B;
interface
implementation
uses A;

编译:

  • 尝试界面A,失败需要B
  • 尝试界面B,好的!
  • 尝试界面A,好的!
  • 尝试实施A,好的!
  • 尝试实施B,好的!

每个单元还有一个初始化部分(如果它有一个初始化部分,它也可以有一个终结部分。)初始化部分用于初始化单元的变量。完成部分用于清理。 当你使用这些时,明智的做法是不要指望其他单位的初始化。保持简单和简短。

单位也是名称空间。 考虑以下内容:

unit A;
interface
const foo = 1;

unit B;
interface
const foo = 2;

unit C;
interface
uses A, B;

const
  f1 = foo;
  f2 = A.foo;
  f3 = B.foo;

如果在多个使用的单位中定义了标识符,则会使用使用列表中的最后一个单位。所以f1 = 2.但你可以在它前面加上单位(命名空间)名称来解决这个问题。

随着.net的引入,允许多部分命名空间引入其他不错的问题:

unit foo;
interface
type
  rec1 = record
    baz : Boolean;
  end;
var
  bar : rec1;

unit foo.bar;
interface
var
  baz : Integer;

uses
  foo, foo.bar;    
begin
  foo.bar.baz := true;
  foo.bar.baz := 1;
end.  

// 1. Which these lines gives an error and why?
// 2. Does the result change if you write uses foo.bar, foo?

在这种情况下,您会发生冲突。但是通过赋予名称空间名称更高的优先级来解决这所以第一行失败了。

答案 3 :(得分:0)

只是不要在接口部分声明方法,它将保持私密。

unit Unit2;

interface
  function MyPublicFunction():Boolean;

implementation

function MyPrivateFunction():Boolean;
begin
  // blah blah
end;

function MyPublicFunction():Boolean;
begin
  // blah blah
end;
end.