2

我只是想掌握单独的单元以使我的代码更加封装。我正在尝试整理我的方法的公共/私有声明,以便我可以从其他使用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

4 回答 4

6

Unit 结构看起来有点像对象中的公共/私有部分,你可以说它是它们的先驱。但是语法不同。

您只需在接口部分声明方法头,如下所示:

interface
  procedure hellofromotherunit();

implementation
  procedure hellofromotherunit(); begin .. end;

每个部分只允许一个。

于 2009-04-03T16:58:16.570 回答
5

Private & Public 仅适用于课程。

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

界面部分中出现的任何内容实际上都是公开的。仅在实现中出现的任何内容都是私有的。

于 2009-04-03T16:58:08.240 回答
1

此外,

每个单元有两个不同的部分。接口和实现。

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

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

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

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

unit A;
interface
uses B;

unit B;
interface
implementation
uses A;

编译:

  • 尝试接口A,失败需要B
  • 试试B接口,ok!
  • 试试接口A,ok!
  • 尝试实现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?

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

于 2009-04-06T06:51:15.383 回答
0

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

unit Unit2;

interface
  function MyPublicFunction():Boolean;

implementation

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

function MyPublicFunction():Boolean;
begin
  // blah blah
end;
end.
于 2016-09-21T09:46:25.640 回答