3

次のコード例の冗長性はご容赦ください。Delphi 2009を使用して、TOtherClassとTMyClassの2つのクラスを作成しました。

TOtherClass = class(TObject)
public
    FData: string;
end;

TMyClass = class(TObject)
private
    FIndxPropList: Array of TOtherClass;
    function GetIndxProp(Index: Integer): TOtherClass;
    procedure SetIndxProp(Index: Integer; Value: TOtherClass);
public
    property IndxProp[Index: Integer]: TOtherClass read GetIndxProp write SetIndxProp;
end;

アクセス指定子は次のように実装されます

function TMyClass.GetIndxProp(Index: Integer): TOtherClass;
begin
    Result := self.FIndxPropList[Index];
end;

procedure TMyClass.SetIndxProp(Index: Integer; Value: TOtherClass);
begin
    SetLength(self.FIndxPropList, Length(self.FIndxPropList) + 1);
    self.FIndxPropList[Length(self.FIndxPropList) - 1] := Value;
end;

その使用法は次のように説明できます。

procedure Test();
var
    MyClass: TMyClass;
begin
    MyClass := TMyClass.Create;
    MyClass.IndxProp[0] := TOtherClass.Create;
    MyClass.IndxProp[0].FData := 'First instance.';
    MyClass.IndxProp[1] := TOtherClass.Create;
    MyClass.IndxProp[1].FData := 'Second instance.';
    MessageDlg(MyClass.IndxProp[0].FData, mtInformation, [mbOk], 0);
    MessageDlg(MyClass.IndxProp[1].FData, mtInformation, [mbOk], 0);
    MyClass.IndxProp[0].Free;
    MyClass.IndxProp[1].Free;
    MyClass.Free;
end;

この「設計」の明らかな欠陥を気にしないでください。RTTIを介してプロパティIndxPropにアクセスできるようにしたいと思い、その後IndxPropを公開されたセクションに移動しました。残念なことに、公開されたセクションではインデックス付きのプロパティが許可されていないことがわかりました。私が理解している限り(RTTIを使用してDelphi配列プロパティにアクセスする方法に関するBarry Kellysのコメントを参照)、D2010に移行してもこれを行うことはできません。

一方、Robert Lovesブログからの引用は次のとおりです。「...プロパティとメソッドは、公開セクションと公開セクションの両方でRTTIを介して利用できるようになり、フィールドはすべてのセクションで利用できるようになりました。」(私のイタリック体。)

私の質問はこれです:D2010でパブリックフィールドのRTTIを取得することが可能である場合、私の元の例(上記のように)はD2010(RTTIを使用)で機能するべきではありませんか?前もって感謝します!

4

1 に答える 1

2

はい、プロパティリーダーが配列フィールドまたはリストクラスフィールドにインデックスを付けるだけの場合は、RTTIを使用してフィールドに直接インデックスを付けることができます。ただし、これはカプセル化を破り、RTTIが主に適している一般的な原則ではなく、特定の実装の詳細にコードを記述する必要があるため、一種の脆弱性があります。RTTIコードはクラスの正確な構造と一致する必要があり、変更された場合はコードも変更する必要があります。そのようなものは、RTTIを使用する目的を無効にします。

ただし、利用可能な代替手段がない場合、配列プロパティにはRTTIがないため、少なくとも現時点では、それが唯一の方法である可能性があります。

編集:この答えを更新します。XE2の拡張RTTIシステムに、インデックス付きプロパティのサポートが追加されました。(ただし、関連性のない安定性の問題があるため、XE3を待つことをお勧めします...)

于 2010-03-22T11:01:27.617 に答える