我正在尝试检查我的私人程序是否真的是私密的。但它的工作方式不应该如此。
请帮助我,也许我错过了关于封装应该如何工作的事情。
此代码不起作用。我猜。但它确实有效。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
tmyclass = class
private
procedure one;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure tmyclass.one;
begin
ShowMessage('1');
end;
procedure TForm1.Button1Click(Sender: TObject);
var myclass:tmyclass;
begin
myclass.one;
end;
end.
谢谢。 (Delphi-7,Win7 x64)。
答案 0 :(得分:9)
private
适用于unit
。
使用最新版本的Delphi,您可以使用strict private
来获得预期的行为。
答案 1 :(得分:3)
private
的含义显然是documented:
私人,受保护和公共会员
私有成员在单位或程序之外是不可见的 class被声明。换句话说,无法调用私有方法 来自另一个模块,并且无法读取私有字段或属性 写入另一个模块。通过放置相关的类声明 在同一个模块中,您可以让类访问彼此 私有成员,但无法更广泛地访问这些成员。 要使一个成员只在其类中可见,它需要 宣布严格私人。
受保护的成员在其类的模块中的任何位置都可见 无论模块如何,都是从任何后代类声明的 后代班出现的地方。可以调用受保护的方法, 以及从中读取或写入的受保护的字段或属性 属于类的一个方法的定义 一个声明了 protected 成员的人。有意成员 通常只用于派生类的实现 的保护强>
公共成员在可以引用其类的任何位置都可见。
严格可见性说明符
除了私有和受保护的可见性说明符之外,Delphi 编译器支持更多访问权限的其他可见性设 限制。这些设置为严格隐私和严格保护 能见度。这些设置可以在Win32应用程序中使用。
具有严格私密可见性的类成员只能访问 在宣布它们的类中。它们是不可见的 在同一单元内声明的程序或功能。班级成员 严格保护可见性在其中的类中可见 他们被宣布,并在任何后代阶级,无论如何 声明的地方。此外,当实例成员(那些 声明没有类或类var 关键字)声明严格 私人或严格保护,它们无法访问 它们出现的类的实例。一个类的实例 无法访问严格受保护的或严格受保护的实例成员 同一类的其他实例。
Delphi的传统私有可见性说明符映射到CLR 装配可视性。 Delphi的受保护的可见性说明符映射到 CLR的装配或家庭可见性。
注意:在类声明的上下文中,单词strict被视为指令。在类声明中,您无法声明 名为'strict'的成员,但在a之外使用是可以接受的 课堂宣言。
您的Delphi版本Delphi 7不支持strict
说明符。
答案 2 :(得分:2)
以下是两个示例单元,用于显示班级中private
,protected
和public
部分的可见性。
unit BaseClass;
interface
type
TBaseClass0 = class
strict private
FStrictPrivate : Integer;
private
FPrivate : Integer;
strict protected
FStrictProtected : Integer;
protected
FProtected : Integer;
public
FPublic : Integer;
procedure DoSomeThing; virtual;
end;
TBaseClass1 = class( TBaseClass0 )
public
procedure DoSomeThing; override;
end;
procedure DoSomeThing( ABase : TBaseClass0 );
implementation
{ TBaseClass0 }
procedure TBaseClass0.DoSomeThing;
begin
FStrictPrivate := 0;
FPrivate := 0;
FStrictProtected := 0;
FProtected := 0;
FPublic := 0;
end;
{ TBaseClass1 }
procedure TBaseClass1.DoSomeThing;
begin
inherited;
// FStrictPrivate := 1; // no access
FPrivate := 1;
FStrictProtected := 1;
FProtected := 1;
FPublic := 1;
end;
procedure DoSomeThing( ABase : TBaseClass0 );
begin
with ABase do
begin
// FStrictPrivate := 3; // no access
FPrivate := 3;
// FStrictProtected := 3; // no access
FProtected := 3;
FPublic := 3;
end;
end;
end.
unit BaseClass2;
interface
uses
BaseClass;
type
TBaseClass2 = class( TBaseClass0 )
public
procedure DoSomeThing; override;
end;
procedure DoSomeThing( ABase : TBaseClass0 );
implementation
{ TBaseClass2 }
procedure TBaseClass2.DoSomeThing;
begin
inherited;
// FStrictPrivate := 2; // no access
// FPrivate := 2; // no access
FStrictProtected := 2;
FProtected := 2;
FPublic := 2;
end;
procedure DoSomeThing( ABase : TBaseClass0 );
begin
with ABase do
begin
// FStrictPrivate := 4; // no access
// FPrivate := 4; // no access
// FStrictProtected := 4; // no access
// FProtected := 4; // no access
FPublic := 4;
end;
end;
end.