Ничего себе.Свойства - это намного больше, чем «они просто обертки для методов получения и установки».
Свойства - это элегантный, но мощный способ предоставления контролируемого доступа к полям класса.
Доступ к полям
Как уже говорилось, вы можете получить доступ к полям класса напрямую.Это очень приятно и делает код более понятным.Это также очень хороший способ реализовать работоспособную первую версию вашего класса.
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 передаст постоянное значение в качестве аргумента методам получения / установки.
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 / времени разработки и т. Д.), Но этот пост начал становиться немного длиннее ...
Подробнее можно прочитать на этих сайтах: