Delphi:使用泛型接受任何“可调用”(例如过程、对象过程、lambda)

jpo*_*234 3 delphi generics callable

在 C++ 鸭子类型中,有可调用的概念,例如可以像函数一样调用的符号。我想用 Delphi 泛型来模拟这一点。

我遇到一个问题,我需要一个可以接受普通过程、类方法或 lambda 作为参数的过程。现在我有 3 个几乎相同的重载实现。有没有办法使用 Delphi 泛型来避免这种重复?

And*_*and 6

为此,您不需要泛型。

与、、 和reference to X兼容(其中是过程类型,例如)。XX of objectreference to XXprocedure(X: Integer)

例如,

program Project1;

{$APPTYPE CONSOLE}

uses
  System.SysUtils;

type
  TTestProc = procedure(X: Integer);
  TTestMeth = procedure(X: Integer) of object;
  TTestRef = reference to procedure(X: Integer);

// Ordinary procedure
procedure TestProc(X: Integer);
begin
end;

// Method
type
  TMyClass = class
    class procedure TestMeth(X: Integer);
  end;

class procedure TMyClass.TestMeth(X: Integer);
begin
end;

begin
  var A: TTestRef;
  A := TestProc;
  A := TMyClass.TestMeth;
  A := procedure(X: Integer) begin end;
end.
Run Code Online (Sandbox Code Playgroud)

  • 通用 [TProc](https://docwiki.embarcadero.com/Libraries/en/System.SysUtils.TProc) 和 [TFunc](https://docwiki.embarcadero.com/Libraries/en/System.SysUtils.TFunc)这里值得一提的是来自 RTL 的。请注意,它们的参数没有“const”修饰符,这可能是自动引用的问题。计算类型,如字符串。 (2认同)