让自己的列表类支持遍历
让自己的列表类支持遍历
涂孟超 发表于3年前
让自己的列表类支持遍历
  • 发表于 3年前
  • 阅读 3
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   


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

unit NumList;

interface

uses 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;

interface

uses 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;

共有 人打赏支持
粉丝 13
博文 2004
码字总数 14107
×
涂孟超
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: