首页 > 解决方案 > 将非类函数添加到通用 TArray 类

问题描述

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;

标签: delphidelphi-xe7generic-collections

解决方案


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

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>()

直接地。添加一个记录助手,并且必须为您希望支持的每种元素类型制作一个,在我看来,这似乎是一种无法证明回报的成本。


推荐阅读