21

しかし、私はプログラミングを学び、Pascal 言語で構造化プログラミングを行った後、Delphi で OOP について学び始めています。

strict privateだから、私は命令と命令の違いを本当に理解していませんprotected..だからここに私のコードがあります、それは「バッグ」の作成についてです、それは私のDelphiのレッスンの紹介です、先生はオブジェクトを作成する方法を教えてくれます:

    uses
  SysUtils;

Type

  Tbag= class (Tobject)                                                          
    strict private                                                                
      FcontenM : single;
      Fcontent : single;
    protected
      function getisempty : boolean;
      function getisfull: boolean;
    public
      constructor creer (nbliters : single);
      procedure add     (nbliters : single);
      procedure clear   (nbliters : single);
      property contenM : single read FcontenM;
      property content : single read Fcontent;
      property isempty : boolean read getisempty;
      property isfull : boolean read getisfull;
    end;


function Tseau.getisempty;
  begin
    result := Fcontent = 0;
  end;

function Tseau.getisfull;
  begin
    result := Fcontent = FcontenM;
  end;

constructor Tseau.creer(nbliters: Single);
  begin
    inherited create;
    FcontenM := nbliters;
  end;

procedure Tbag.add (nbliters: Single);
  begin
    if ((FcontenM - Fcontent) < nbliters) then fcontent := fcontenM
      else Fcontent := (Fcontent + nbliters);
  end;

procedure Tbag.clear (nbliters: Single);
  begin
    if (Fcontent > nbliters) then Fcontent := (Fcontent - nbliters)
      else Fcontent := 0;
  end;

したがって、これはオブジェクト作成の単なる例です。public 宣言 (外部からアクセス可能なインターフェイス) とは何かを理解していますが、private 宣言と protected 宣言の違いがわかりません..私を助けてくれてありがとう..

4

5 に答える 5

35

プライベート、保護、およびパブリックの違いは非常に簡単です。

  • プライベート メンバー/メソッドは、それらを宣言するクラス内でのみ表示されます。
  • 保護されたメンバー/メソッドは、クラス内およびすべてのサブクラスに表示されます。
  • パブリック メンバーとメソッドは、他のすべてのクラスから参照できます。

Delphi には、同じユニット内ですべてのメンバーの可視性を公開する「バグ」があります。strictキーワードはこの動作を修正するため、1 つのユニット内であっても、private は実際には非公開になります。適切なカプセル化のために、strict キーワードを常に使用することをお勧めします。

コード例:

type
  TFather = class
  private
    FPriv : integer;
  strict private
    FStrPriv : integer;
  protected
    FProt : integer;
  strict protected
    FStrProt : integer;
  public
    FPublic : integer;
  end;

  TSon = class(TFather)
  public
    procedure DoStuff;
  end;

  TUnrelated = class
  public
    procedure DoStuff;
  end;

procedure TSon.DoStuff;
begin
  FProt := 10;       // Legal, as it should be. Accessible to descendants.
  FPriv := 100;      // Legal, even though private. This won't work from another unit!
  FStrictPriv := 10; // <- Compiler Error, FStrictPrivFather is private to TFather
  FPublic := 100;    // Legal, naturally. Public members are accessible from everywhere.
end;

procedure TUnrelated.DoStuff;
var
  F : TFather;
begin
  F := TFather.Create;
  try
    F.FProt := 10;     // Legal, but it shouldn't be!
    F.FStrProt := 100; // <- Compiler error, the strict keyword has "made the protection work"
    F.FPublic := 100;  // Legal, naturally.
  finally
    F.Free;
  end;
end;
于 2009-10-04T14:35:50.560 に答える
6

厳密なプライベート - このクラス内からのみ表示およびアクセスできます。

private - このクラスおよびこのクラス ユニット内からのみ表示およびアクセスできます。

protected - 子孫クラス内からのプライベート PLUS と同じ

ここでカプセル化の詳細とアイデアを読むことができます: http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29#Encapsulation

于 2009-10-04T14:15:49.743 に答える
5

どこでもこれを調べることができたでしょう(キーワードは「アクセス修飾子」になります)

基本的に、保護されているとは、メンバーが子クラスおよびユニット全体で表示されることを意味します。厳密なプライベートは、このクラスのメンバー メソッドでのみメンバーにアクセスできることを意味します。

于 2009-10-04T14:11:51.913 に答える
5

他の回答には 1 つのケースがありません。他のインスタンスのフィールドでprivateさえstrict private 、クラス内のコードからアクセスできます

type
  TSO1516493= class
  strict private
    A: Integer;
  public
    procedure ChangeOther(Param: TSO1516493);
  end;

{ TSO1516493 }

procedure TSO1516493.ChangeOther(Param: TSO1516493);
begin
  Param.A := -1; // accessing a strict private variable in other instance !
end;

(これは Java と同じ動作です。)

于 2011-12-05T09:09:41.490 に答える
3

他の回答に欠落しているもう1つのケース。クラスのカプセル化規則を「拡張」する可能性があります。

Delphi 8 で(.NET 互換性のために)導入されたクラス ヘルパーを使用すると、private、protected、public の可視性の違い(および厳密な表記法さえも)を回避できます。クラス ヘルパーの宣言は、元のクラスとは別のユニットで行うことができます。

これは例です:

type
  TMyOrgClass = class
  strict private
    FMyPrivateProp: Integer;
  strict protected
    property MyPrivateProp: Integer read FMyPrivateProp;
  end;

  TMyClassHelper = class helper for TMyOrgClass
  private
    function GetMyPublicProp: Integer;
  public
    property MyPublicProp: Integer read GetMyPublicProp;
  end;

function TMyClassHelper.GetMyPublicProp: Integer;
begin
  Result:= Self.FMyPrivateProp;  // Access the org class members with Self
end;

詳細については、この投稿を参照してください: access-a-strict-protected-property-of-a-delphi-class

于 2011-12-06T23:41:06.823 に答える