【问题标题】:Adding non class functions to generic TArray class将非类函数添加到泛型 TArray 类
【发布时间】:2020-03-11 08:21:48
【问题描述】:

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;

【问题讨论】:

  • 单元System中的TArray&lt;T&gt;类型与System.Generics.Collections中的TArray类不同。使用记录助手怎么样?更多详情请查看您自己的Q and the accepted A
  • @DelphiCoder:这是一个不同的问题,我想使用泛型数组
  • @Fabrizio 这个问题一点都不清楚,不是吗? TArray.Sort&lt;T&gt;() 不要求您传递通用数组。
  • @DavidHeffernan:同意,这可能很容易被误解......我已经更新了问题
  • 这是一个相当长一段时间的开放请求:quality.embarcadero.com/browse/RSP-10336

标签: delphi delphi-xe7 generic-collections


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    相关资源
    最近更新 更多