代码之家  ›  专栏  ›  技术社区  ›  Fabrizio RAHUL S R

向TArray类添加非类函数

  •  0
  • Fabrizio RAHUL S R  · 技术社区  · 5 年前

    System.Generics.Collections TArray

    class procedure Sort<T>(var Values: array of T); overload; static;
    

    这意味着唯一被接受的语法是:

    var
      Arr : TArray<integer>;
    begin
      SetLength(Arr, 2);
      Arr[0] := 5;
      Arr[1] := 3;
    
      TArray.Sort<integer>(Arr);
    end;
    

    我想定义一个对象的函数,以便使用以下语法对泛型数组的值进行排序:

    var
      Arr : TArray<integer>;
    begin
      SetLength(Arr, 2);
      Arr[0] := 5;
      Arr[1] := 3;
    
      Arr.Sort();
    end;
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   David Heffernan    5 年前

    可以为非泛型动态数组或完全专用的泛型动态数组定义帮助程序。例如,您可以编写:

    type
      TMyArray1 = array of Integer;
      TMyArray2 = TArray<Integer>;
    
      TMyArrayHelper1 = record helper for TMyArray1
      end;
      TMyArrayHelper2 = record helper for TMyArray2
      end;
      TMyArrayHelper3 = record helper for TArray<Integer>
      end;
    

    这允许您将方法添加到此类数组的范围中。

    所以你可以写

    type
      TIntegerArrayHelper = record helper for TArray<Integer>
        procedure Sort;
      end;
    
    procedure TIntegerArrayHelper.Sort;
    begin
      TArray.Sort<Integer>(Self);
    end;
    

    但是,你不能写:

      TMyArrayHelper<T> = record helper for TArray<T>
      end;
    

    编译器不支持泛型帮助程序。

    在我看来,这些都不值得,只要打电话给:

    TArray.Sort<T>()
    

    直接的。在我看来,添加一个记录帮助器,并且必须为您希望支持的每个元素类型创建一个帮助器,这似乎是一个不值得返回的开销。