9

クラスのセッターごとに、いくつかのイベント ロジック (OnChanging、OnChanged) を実装する必要があります。

procedure TBlock.SetWeightIn(const Value: Double);
var OldValue: Double;
begin
  OldValue := FWeightIn;
  DoOnChanging(OldValue, Value);
  FWeightIn := Value;
  DoOnChanged(OldValue, Value);
end;

procedure TBlock.SetWeightOut(const Value: Double);
var OldValue: Double;
begin
  OldValue := FWeightOut;
  DoOnChanging(OldValue, Value);
  FWeightOut := Value;
  DoOnChanged(OldValue, Value);
end;

セッターごとにこれらすべての行を複製せずにこれを実装する方法を提案できますか?

4

4 に答える 4

7

Delphi は、インデックス付きプロパティをサポートしています。複数のプロパティが単一のゲッターまたはセッターを共有でき、序数インデックスによって区別されます。

type
  TWeightType = (wtIn, wtOut);
  TBlock = class
  private
    procedure SetWeight(Index: TWeightType; const Value: Double);
    function GetWeight(Index: TWeightType): Double;
  public
    property InWeight: Double index wtIn read GetWeight write SetWeight;
    property OutWeight: Double index wtOut read GetWeight write SetWeight;
  end;

これをCobusの答えと組み合わせて、これを得ることができます:

procedure TBlock.SetWeight(Index: TWeightType; const Value: Double);
begin
  case Index of
    wtIn: SetField(FWeightIn, Value);
    wtOut: SetField(FWeightOut, Value);
  end;
end;

これにより、そのような関連する値に対して 2 つの完全に別個のフィールドを用意する代わりに、インデックスによってフィールドを参照できる他の方法のアイデアが得られるかもしれません。

于 2009-07-23T07:48:47.270 に答える
0

プロシージャ/関数のパラメータが同じで、begin と end の間のコードが同じである場合は、そのまま使用できます

procedure SetWeightValue(const Value: Double);
var OldValue: Double;
begin
  OldValue := FWeightIn;
  DoOnChanging(OldValue, Value);
  FWeightIn := Value;
  DoOnChanged(OldValue, Value);
end;

それでおしまい...

于 2009-09-12T08:08:11.490 に答える