わお。プロパティには、「getterメソッドとsetterメソッドの単なるラッパー」よりもはるかに多くのものがあります。
プロパティは、クラスフィールドへの制御されたアクセスを防ぐための、エレガントでありながら強力な方法です。
フィールドへのアクセス
すでに述べたように、クラスフィールドに直接アクセスできます。これは確かに非常に素晴らしく、コードをより明確にします。これは、クラスの実行可能な最初のバージョンを実装するための非常に優れた方法でもあります。
TMyClass = class
private
FValue: String;
public
property Value: String read FValue write FValue;
end;
後で、クラスを再設計して、メソッドを使用してフィールドアクセスを検証および操作できます。パブリックインターフェイスは引き続き同じです。
TMyClass = class
private
FValue: String;
procedure SetValue(AValue: String);
public
property Value: String read FValue write SetValue;
end;
procedure TMyClass.SetValue(AValue: String);
begin
if AValue = ''
then FValue := 'No value!'
else FValue := AValue;
end;
アクセスの制御
プロパティを使用すると、読み取り専用/書き込み専用フィールドの概要を簡単に確認できます。例:読み取り専用/不変クラス:
TClient = class
private
FName: String;
FSite: String;
FMail: String;
public
constructor Create(AName, ASite, AMail: String);
property Name: String read FName;
property Site: String read FSite;
property Mail: String read FMail;
end;
ポリモーフィズム
TClient = class
private
FName: String;
protected
function GetName: String; virtual; abstract;
public
property Name: String read GetName write FName;
end;
TImportantClient = class(TClient)
protected
function GetName: String; override;
end;
TArgumentativeClient = class(TClient)
protected
function GetName: String; override;
end;
function TImportantClient.GetName: String;
begin
Result := '+++ ' + FName;
end;
function TArgumentativeClient.GetName: String;
begin
Result := ':-( ' + FName;
end;
{----- ----- ----- ----- -----}
var
ClientA,
ClientB: TClient;
begin
ClientA := TImportantClient.Create;
ClientB := TArgumentativeClient.Create;
ClientA.Name := 'Mr. Nice';
ClientB.Name := 'Mr. Dumbhead';
ShowMessage(ClientA.Name);
ShowMessage(ClientB.Name);
end;
{----- ----- ----- ----- -----}
デフォルトのプロパティ
クラスでは、デフォルトのクラスフィールドを定義できます。これは、プロパティ名を指定せずにフィールドに直接アクセスできることを意味します。
A := MyStringList[i]:
MyStringList[i] := B;
{ instead of }
A := MyStringList.Strings[i];
MyStringList.Strings[i] := B;
{ or }
A := MyStringList.GetString(i);
MyStringList.SetString(i, B);
索引
キーワードを使用するIndex
と、Delphiはgetter/setterメソッドに引数として定数値を渡します。
TMyRect = class
private
FValues: Array[0..3] of Integer;
function GetProperty(Index: Integer): Integer;
public
property Top : Integer Index 0 read GetProperty;
property Left : Integer Index 1 read GetProperty;
property Width : Integer Index 2 read GetProperty;
property Height : Integer Index 3 read GetProperty;
end;
function TMyRect.GetProperty(Index: Integer): Integer;
begin
Result := FValues[Index];
end;
いくつかのリソース
カバーするトピックはまだいくつかあります(インターフェイスの実装、保存された値、RTTI /設計時のプロパティなど)が、この投稿は少し長くなり始めました...
これらのサイトで詳細を読むことができます: