Delphi'private'子句(指令)不起作用

时间:2013-05-15 00:15:03

标签: delphi class object private

我正在尝试检查我的私人程序是否真的是私密的。但它的工作方式不应该如此。

请帮助我,也许我错过了关于封装应该如何工作的事情。

此代码不起作用。我猜。但它确实有效。

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)。

3 个答案:

答案 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)

以下是两个示例单元,用于显示班级中privateprotectedpublic部分的可见性。

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.