2

列挙型をプライベート フィールドに渡す次のコードがあります。

interface

type    

TMyClassEnumerator = class(TEnumerator<TMyClass>)
end;

TMyContainerClass = class(TObject)
private
  FItems: TObjectDictionary<string, TMyClass>;
public
  function GetEnumerator: TMyClassEnumerator;
end;

implementation

function TMyContainerClass.GetEnumerator: TMyClassEnumerator;
begin
  Result := TMyClassEnumerator(FItems.Values.GetEnumerator);
end;

私はこれを正しく行っていますか?私は独自のインターフェースを実装IENumerable<TMyClass>または作成することで戦いましたが、コンパイルするものはありませんでしたfor..in.

4

1 に答える 1

3

あなたのアプローチは健全ですが、列挙子クラスをキャストしたり、実際に宣言したりする必要があるとは思いません。私は次のようにします:

TMyContainerClass = class
private
  FItems: TObjectDictionary<string, TMyClass>;
public
  function GetEnumerator: TEnumerator<TMyClass>;
end;

function TMyContainerClass.GetEnumerator: TEnumerator<TMyClass>;
begin
  Result := FItems.Values.GetEnumerator;
end;
于 2013-02-02T13:57:06.620 に答える