Добавление не классовых функций в обобщенный класс TArray c - PullRequest
1 голос
/ 11 марта 2020

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

Я хотел бы определить функцию объекта для сортировки значений массива generi c, используя следующий синтаксис:

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

  Arr.Sort();
end;

1 Ответ

0 голосов
/ 11 марта 2020

Вы можете определить помощники для не универсальных c динамических c массивов или для полностью специализированных универсальных c динамических c массивов. Например, вы можете написать:

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;

Компилятор просто не поддерживает generi c помощников.

На мой взгляд, ничего из этого не стоит, просто позвоните:

TArray.Sort<T>()

напрямую. Добавление помощника по записи и необходимость его создания для каждого типа элемента, который вы sh должны поддерживать, кажется мне ценой, которая не оправдывает возврат.

...