Tôi đang sử dụng Delphi XE để thực hiện một điều tra viên cho phép lọc các phần tử của danh sách theo loại. Tôi đã nhanh chóng lắp ráp một đơn vị kiểm tra như sau:Danh sách thực hiện Enumerator OfType <T> trong Delphi
unit uTestList;
interface
uses Generics.Collections;
type
TListItemBase = class(TObject)
end; { TListItemBase }
TListItemChild1 = class(TListItemBase)
end;
TListItemChild2 = class(TListItemBase)
end;
TTestList<T : TListItemBase> = class;
TOfTypeEnumerator<T, TFilter> = class(TInterfacedObject, IEnumerator<TFilter>)
private
FTestList : TList<T>;
FIndex : Integer;
protected
constructor Create(Owner : TList<T>); overload;
function GetCurrent : TFilter;
function MoveNext : Boolean;
procedure Reset;
function IEnumerator<TFilter>.GetCurrent = GetCurrent;
function IEnumerator<TFilter>.MoveNext = MoveNext;
procedure IEnumerator<TFilter>.Reset = Reset;
end;
TOfTypeEnumeratorFactory<T, TFilter> = class(TInterfacedObject, IEnumerable)
private
FTestList : TList<T>;
public
constructor Create(Owner : TList<T>); overload;
function GetEnumerator : TOfTypeEnumerator<T, TFilter>;
end;
TTestList<T : TListItemBase> = class(TList<T>)
public
function OfType<TFilter : TListItemBase>() : IEnumerable;
end; { TTestList }
implementation
{ TOfTypeEnumerator<T, TFilter> }
constructor TOfTypeEnumerator<T, TFilter>.Create(Owner: TList<T>);
begin
inherited;
FTestList := Owner;
FIndex := -1;
end;
function TOfTypeEnumerator<T, TFilter>.GetCurrent: TFilter;
begin
Result := TFilter(FTestList[FIndex]);
end;
function TOfTypeEnumerator<T, TFilter>.MoveNext: Boolean;
begin
Inc(FIndex);
while ((FIndex < FTestList.Count)
and (not FTestList[FIndex].InheritsFrom(TFilter))) do
begin
Inc(FIndex);
end; { while }
end;
{ TOfTypeEnumeratorFactory<T, TFilter> }
constructor TOfTypeEnumeratorFactory<T, TFilter>.Create(Owner: TList<T>);
begin
inherited;
FTestList := Owner;
end;
function TOfTypeEnumeratorFactory<T, TFilter>.GetEnumerator: TOfTypeEnumerator<T, TFilter>;
begin
Result := TOfTypeEnumerator<T,TFilter>.Create(FTestList);
end;
{ TTestList<T> }
function TTestList<T>.OfType<TFilter>: IEnumerable;
begin
Result := TOfTypeEnumeratorFactory<T,TFilter>.Create(self);
end;
end.
Biên dịch đơn vị này không thành công với lỗi F2084 Lỗi nội bộ: D7837. Tôi chắc chắn có thể làm điều này mà không có một điều tra viên, nhưng tôi muốn có sẵn một số để làm cho mã nhất quán. Tôi đã có một vấn đề trình biên dịch tương tự khi cố gắng để thực hiện điều này trên đầu trang của Spring4D, nhưng figured tôi sẽ đưa ra một đồng bằng, vanilla Delphi vấn đề ở đây.
Có ai có triển khai thay thế thực sự biên dịch không?
Cảm ơn.
Cùng trong XE2. Gửi đến QC. Generics vẫn còn khá nhiều không sử dụng được. –
Chỉ cần gửi tới QC - # 105719. Cảm ơn. –
http://qc.embarcadero.com/wc/qcmain.aspx?d=105719 –