4

私たちは言うことができます:

type
  TPerson = class
   private
     pName : string;
   public
     property Name : string read pName write pName;
end;

と等しい:

 type
  TPerson = class
   private
     pName : string;
   public
     procedure SetName(val: string);
     function GetName:String;
end;

//{... implementing SetName And GetName...}

??

「プロパティ」を使用する必要がある場所と使用しない場所を説明してください。Tnx

4

3 に答える 3

13

クラスのデザインがすべてです。技術的には、プロパティを使用して実行できる「すべて」はプロパティなしで実行できますが、コードはそれほどエレガントではありません。優れた設計により、クラスが使いやすくなり、間違いを犯すリスクが軽減されます。

まず、あなたの比較

TPerson = class
  private
    FName: string;
  public
    property Name: string read FName write FName;
  end;

TPerson = class
  private
    FName: string;
  public
    procedure SetName(const Name: string);
    function GetName: string;
  end;

かなり公平ではありません。実際、最初のケースでは、値が設定されている(または読み取られている)ときに何かを行う可能性はありません。したがって、より適切な比較は、後者のコードを次のように比較することです。

TPerson = class
  private
    FName: string;
    procedure SetName(const Name: string);
    function GetName: string;
  public
    property Name: string read GetName write SetName;
  end;

たとえば、コントロールを作成する場合、プロパティを変更するときに、コントロールを無効にする(基本的には再描画する)必要があります。たとえば、の「セーターの色」などTPersonです。例えば、

TPerson = class
  private
    FSweaterColor: string;
    procedure SetSweaterColor(const Value: TColor);
  public
    property SweaterColor: TColor read FSweaterColor write SetSweaterColor;
  end;

  ...

  implementation

  procedure TPerson.SetSweaterColor(const Value: TColor);
  begin
    if FSweaterColor <> Value then
    begin
      FSweaterColor := Value;
      Invalidate; // causes a repaint of the control
    end;
  end;

とにかく、プロパティのポイントは何ですか?さて、基本的に、ポイントはクラスの優れたインターフェースを作成することです。それは、その実装の詳細に興味がない人にとっては使いやすいはずです。プロパティを使用することで、この目標を達成できます。確かに、セーターの現在の色を読み取るには、を読むだけでAnna.SweaterColor、設定するには、を読むだけAnna.SweaterColor := clRedです。これが単に変数を設定するのか、プロシージャを実行するのかはわかりませんが、気にしません。あなたに関する限り、TPersonオブジェクトは単に。と呼ばれる読み取り可能で設定可能なプロパティを持っていますSweaterColor

write読み取り専用(no )または書き込み専用(no)のプロパティを作成することもできますreadreadただし、プロパティのand (あるとしても)をどのように実装してもwrite、クラスユーザーの観点からはプロパティは同じように見えます。彼は使用することを覚えておく必要はありませんSetSweaterColorGetSweaterColor実際、それらはプライベートであり、彼はアクセスできません)が、プロパティのみを使用しSweaterColorます。

これは、プロパティを使用することの別の利点も示唆しています。パブリックプロパティと公開プロパティはクラスのユーザーに表示されますが、プライベートメンバーは表示されません(フィールドFSweaterColorSetSweaterColorプロシージャなど)。これはいい。クラスユーザーが人のセーターの色を変更する唯一の方法は、SweaterColorプロパティを使用することであることがわかったためです。これにより、コントロールが再描画されることが保証されます。変数がpublicの場合FSweaterColor、クラスのユーザーはこれを設定して、「セーターの色を変更しても何も起こらないのはなぜですか」と疑問に思うかもしれません。もちろん、この利点を得るためにプロパティは必要ありません。プライベートFSweaterColorフィールドとパブリックGetSweaterColorでありSetSweaterColor、同様に機能しますが、次のように記述する必要があります。GetSweaterColor色を取得するための処理は必要ありませんが、機能します。また、クラスのユーザーは、 1つではなく2つの識別子を使用することを学ぶ必要があります。

より具体的には、Delphi IDEを使用してプログラミングすると、published property(-y + ies)がオブジェクトインスペクターに表示され、そこで読み取り/変更が許可されます(該当する場合)。プロパティがなかったら、どうしてそれが可能でしょうか?

とはいえ、プロパティを使用できない場合もあります。たとえば、読み取り専用の「プロパティ」がある場合は、読み取り専用のプロパティではGetSomethingなく、単一のパブリック関数を使用できます。結局のところ、それはあなたにいくつかのコーディングを節約するでしょう。同様に、書き込み専用プロパティがある場合は、単一のパブリックSetSomethingプロシージャを使用できます。これにより、コードも節約できます。最後に、どちらの方法でも(取得も設定も)処理を必要としない読み取り/書き込みプロパティがある場合は、単純にパブリック変数を使用できます。

したがって、結局のところ、クラスごとにクラスの適切な設計を決定する必要があります。私の過度に長い答えの短いバージョンは、Davidのコメントに似ていると思います。

どちらか便利な方を使用してください。

于 2013-02-16T13:00:58.333 に答える
1

プロパティは、シンタックスシュガーの素晴らしい部分です。これらはgetEnabledメソッドとsetEnabledメソッドのペアと同等ですが、ほとんどのプログラマー(およびプログラミング言語)は代わりにプロパティを好みます。たとえば、コード完了ウィンドウのエントリは少なくなります。

さらに、それらは「変数のような」もの(つまり、データ、オブジェクトが機能することになっている)を、データを処理するメソッドから分離します。

プロパティはコンポーネントに限定されず、それ以外の場合は非常に便利です。プロパティを使用してパブリックインターフェイスを定義し、後で検証ロジックを実装できます。(パブリックフィールドでは不可能です)しかし、メソッドの8行と比較して、単純なプロパティのコードは2行しか必要ありません。

オブジェクトインスペクターにとってより重要なのはpublishedキーワードであり、公開されたプロパティのみがOIに表示されます。

于 2013-02-16T12:57:23.530 に答える
0

いいえ。これら2つのコードは等しくありません。

propertyクラスをコンポーネントとして実装するときに使用しTPerson、Delphiのオブジェクトインスペクターでカスタマイズできます。たとえば、TButtonクラスを見てください。オブジェクトインスペクターで変更できるすべてのもの(、、、Captionなど)はWidth、ソースコードでキーワードNameでマークされています。property

プログラムで使用されるがコンポーネントとしては使用されないpropertyクラスを作成する場合は、キーワードを使用しません。

于 2013-02-16T12:07:27.283 に答える