1

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

请帮助我,也许我错过了一些关于封装应该如何工作的内容。

此代码不应该工作。我猜。但它有效。

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.

谢谢你。(德尔福 7,Win7 x64)。

4

3 回答 3

9

private是为了一个unit

使用最新版本的 Delphi,您可以使用strict private来获得预期的行为。

于 2013-05-15T00:18:07.327 回答
3

的含义private已明确记录

私人、受保护和公共成员

私有成员在声明其类的单元或程序之外是不可见的。换句话说,不能从另一个模块调用私有方法,也不能从另一个模块读取或写入私有字段或属性。通过将相关的类声明放在同一个模块中,您可以让类访问彼此的 私有成员,而不会使这些成员更广泛地访问。要使成员仅在其类中可见,需要将其声明为strict private

保护的成员在声明其类的模块中的任何位置以及任何后代类中都是可见的,无论后代类出现在哪个模块中。可以从属于声明受保护成员的类的任何方法的定义调用受保护的方法,并读取或写入受保护的字段属性仅用于派生类实现的成员通常是 受保护的。

公共成员在其类可以被引用的任何地方都是可见的。

严格的可见性说明符

除了私有受保护的可见性说明符之外,Delphi 编译器还支持具有更大访问约束的附加可见性设置。这些设置是严格的私有严格保护的 可见性。这些设置可以在 Win32 应用程序中使用。

具有严格私有可见性的类成员只能在声明它们的类中访问。它们对同一单元内声明的过程或函数不可见。具有严格受保护可见性的类成员在声明它们的类中以及任何后代类中都是可见的,无论它在哪里声明。此外,当实例成员(没有classclass var关键字声明的那些)被声明为strict privatestrict protected时,它们在它们出现的类的实例之外是不可访问的。类的实例不能访问严格保护同一类的其他实例中的受严格保护的实例成员。

Delphi 的传统私有可见性说明符映射到 CLR 的程序集可见性。Delphi 的受保护可见性说明符映射到 CLR 的程序集或系列可见性。

注意:严格一词在类声明的上下文中被视为指令。在类声明中,您不能声明名为“strict”的成员,但可以在类声明之外使用。

您的 Delphi 版本 Delphi 7 不支持说明strict符。

于 2013-05-15T08:34:35.870 回答
2

下面是两个示例单元,用于显示类的可见性privateprotected部分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.
于 2013-05-15T07:03:11.307 回答