让自己的列表类支持遍历

来源:转载


一个普通的数字列表类(TNumList), 还没有支持遍历:



unit NumList;interfaceuses SysUtils;type TNumList = class private FCount: Integer; FNumArray: array of Double; function GetNum(aIndex: Integer): Double; procedure SetNum(aIndex: Integer; aNum: Double); public constructor Create(aCount: Integer); property Count: Integer read FCount; property Nums[Index: Integer]: Double read GetNum write SetNum; default; end;implementation{ TNumList }constructor TNumList.Create(aCount: Integer);begin inherited Create; FCount := aCount; SetLength(FNumArray, FCount);end;function TNumList.GetNum(aIndex: Integer): Double;begin if (aIndex < 0) or (aIndex >= FCount) then raise Exception.Create('索引越界'); Result := FNumArray[aIndex];end;procedure TNumList.SetNum(aIndex: Integer; aNum: Double);begin if aIndex >= FCount then begin FCount := aIndex + 1; SetLength(FNumArray, FCount); end; FNumArray[aIndex] := aNum;end;end. //end//调用测试:uses NumList;procedure TForm1.Button1Click(Sender: TObject);var nList: TNumList; i: Integer;begin nList := TNumList.Create(5); for i := 0 to nList.Count - 1 do //赋值 begin nList[i] := Random(1000) / 100; end; Memo1.Clear; for i := 0 to nList.Count - 1 do //取值 begin Memo1.Lines.Add(FloatToStr(nList[i])); end; nList.Free;end;


支持遍历的 TNumList 类:

unit NumList;interfaceuses SysUtils;type TNumList = class; TNumEnumerator = class private FIndex: Integer; FNumList: TNumList; public constructor Create(aNumList: TNumList); function GetCurrent: Double; function MoveNext: Boolean; property Current: Double read GetCurrent; end; TNumList = class private FCount: Integer; FNumArray: array of Double; function GetNum(aIndex: Integer): Double; procedure SetNum(aIndex: Integer; aNum: Double); public constructor Create(aCount: Integer); function GetEnumerator: TNumEnumerator; //! property Count: Integer read FCount; property Nums[Index: Integer]: Double read GetNum write SetNum; default; end;implementation{ TNumList }constructor TNumList.Create(aCount: Integer);begin inherited Create; FCount := aCount; SetLength(FNumArray, FCount);end;function TNumList.GetEnumerator: TNumEnumerator;begin Result := TNumEnumerator.Create(Self);end;function TNumList.GetNum(aIndex: Integer): Double;begin if (aIndex < 0) or (aIndex >= FCount) then raise Exception.Create('索引越界''); Result := FNumArray[aIndex];end;procedure TNumList.SetNum(aIndex: Integer; aNum: Double);begin if aIndex >= FCount then begin FCount := aIndex + 1; SetLength(FNumArray, FCount); end; FNumArray[aIndex] := aNum;end;{ TNumEnumerator }constructor TNumEnumerator.Create(aNumList: TNumList);begin inherited Create; FIndex := -1; FNumList := aNumList;end;function TNumEnumerator.GetCurrent: Double;begin Result := FNumList[FIndex];end;function TNumEnumerator.MoveNext: Boolean;begin Result := FIndex < FNumList.Count - 1; if Result then Inc(FIndex);end;end. //end//调用测试uses NumList;procedure TForm1.Button1Click(Sender: TObject);var nList: TNumList; i: Integer; num: Double;begin nList := TNumList.Create(5); for i := 0 to nList.Count - 1 do //赋值 begin nList[i] := Random(1000) / 100; end; Memo1.Clear; for num in nList do //遍历 begin Memo1.Lines.Add(FloatToStr(num)); end; nList.Free;end;


分享给朋友:
您可能感兴趣的文章:
随机阅读: