是否可以对属性使用相同的 Getter/Setter?

M Λ*_*I K 10 delphi properties

我有一个包含多个变量的类,可以通过它们自己的属性访问:

TGame = class(TObject)
   strict private
      FValue1 : Integer;
      FValue2 : Integer;
   private
      procedure SetValue1(const Value : Integer);
      procedure SetValue2(const Value : Integer);
      function GetValue1() : Integer;
      function GetValue2() : Integer;
   public
      property Value1 : Integer read GetValue1 write SetValue1;
      property Value2 : Integer read GetValue2 write SetValue2;
Run Code Online (Sandbox Code Playgroud)

我想知道,是否有办法对不同的属性使用相同的 Getter 和 Setter,如下所示:

property Value1 : Integer read GetValue write SetValue;
property Value2 : Integer read GetValue write SetValue;
Run Code Online (Sandbox Code Playgroud)

And*_*and 20

是的,这可以使用索引说明符来实现:

索引说明符允许多个属性共享相同的访问方法,同时表示不同的值。

例如,

type
  TTest = class
  strict private
    FValues: array[0..1] of Integer;
    function GetValue(Index: Integer): Integer;
    procedure SetValue(Index: Integer; const Value: Integer);
  public
    property Value1: Integer index 0 read GetValue write SetValue;
    property Value2: Integer index 1 read GetValue write SetValue;
  end;

{ TTest }

function TTest.GetValue(Index: Integer): Integer;
begin
  Result := FValues[Index];
end;

procedure TTest.SetValue(Index: Integer; const Value: Integer);
begin
  FValues[Index] := Value;
end;
Run Code Online (Sandbox Code Playgroud)

当然,这也适用于您原来的私有字段:

type
  TTest = class
  strict private
    FValue1: Integer;
    FValue2: Integer;
    function GetValue(Index: Integer): Integer;
    procedure SetValue(Index: Integer; const Value: Integer);
  public
    property Value1: Integer index 1 read GetValue write SetValue;
    property Value2: Integer index 2 read GetValue write SetValue;
  end;

{ TTest }

function TTest.GetValue(Index: Integer): Integer;
begin
  case Index of
    1:
      Result := FValue1;
    2:
      Result := FValue2;
  else
    raise Exception.Create('Invalid index.');
  end;
end;

procedure TTest.SetValue(Index: Integer; const Value: Integer);
begin
  case Index of
    1:
      FValue1 := Value;
    2:
      FValue2 := Value;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

但似乎您更愿意需要一个数组属性

type
  TTest = class
  strict private
    FValues: array[0..1] of Integer;
    function GetValue(Index: Integer): Integer;
    procedure SetValue(Index: Integer; const Value: Integer);
  public
    property Values[Index: Integer]: Integer read GetValue write SetValue;
  end;

{ TTest }

function TTest.GetValue(Index: Integer): Integer;
begin
  Result := FValues[Index];
end;

procedure TTest.SetValue(Index: Integer; const Value: Integer);
begin
  FValues[Index] := Value;
end;
Run Code Online (Sandbox Code Playgroud)