我只是试图抓住单独的单元来使我的代码更加封装。
我正在尝试将我的方法的公共/私有声明整理出来,因此我可以从使用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
答案 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;
编译:
每个单元还有一个初始化部分(如果它有一个初始化部分,它也可以有一个终结部分。)初始化部分用于初始化单元的变量。完成部分用于清理。 当你使用这些时,明智的做法是不要指望其他单位的初始化。保持简单和简短。
单位也是名称空间。 考虑以下内容:
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.