• 让自己的列表类支持遍历



    一个普通的数字列表类(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;
    

  • 相关阅读:
    C#基础
    进制转换
    养猪和存储空间
    独热码和二进制码
    mux_xz
    饮料机
    亚稳态
    mos管功耗
    功能覆盖率和代码覆盖率
    时序逻辑电路输出特点
  • 原文地址:https://www.cnblogs.com/del/p/2041064.html
Copyright © 2020-2023  润新知