加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 我对匿名方法类型使用什么通用约束?

发布时间:2020-12-15 09:38:56 所属栏目:大数据 来源:网络整理
导读:我想声明一个通用记录,如下所示: type TMyDelegateT: constraint = record private fDelegate: T; public class operator Implicit(a: T): TMyDelegate; class operator Implicit(A: TMyDelegate: T); end; 我想限制T引用过程/函数. (越多越好). 我试过这个
我想声明一个通用记录,如下所示:

type
  TMyDelegate<T: constraint> = record
  private
    fDelegate: T;
  public
    class operator Implicit(a: T): TMyDelegate;
    class operator Implicit(A: TMyDelegate: T);
  end;

我想限制T引用过程/函数. (越多越好).

我试过这个,但它没有编译:

program Project3;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

type

  TProc1 = reference to procedure(a: Integer);
  TProc2 = reference to procedure(b: TObject);

  TTest<T: TProc1,TProc2> = record
  private
    fData: T;
  public
    class operator Implicit(a: T): TTest<T>;
    class operator Implicit(a: TTest<T>): T;
  end;

  { TTest<T> }

class operator TTest<T>.Implicit(a: T): TTest<T>;
begin
  Result.fData:= a;
end;

class operator TTest<T>.Implicit(a: TTest<T>): T;
begin
  Result:= a.fData;
end;

var
  Delegate1: TProc1;
  Delegate2: TProc2;

var
  MyTest1: TTest<TProc1>;  <<-- error
  MyTest2: TTest<TProc2>;

begin
  MyTest1:=
    procedure(a: Integer)
    begin
      WriteLn(IntToStr(a));
    end;
end.

这给出了编译错误:

[dcc32 Error] Project3.dpr(39): E2514 Type parameter ‘T’ must support interface ‘TProc2’

有没有办法将泛型类型约束为(列表)匿名类型?

解决方法

没有办法指定这样的约束.可能的限制是:

>价值类型.
>类,源自特定的祖先.
>界面,源自特定的祖先.
>无参数构造函数.

这在文档中有所介绍:http://docwiki.embarcadero.com/RADStudio/en/Constraints_in_Generics

文档没有说明的是引用过程类型计为接口.这就是你的泛型类型使用该约束进行编译的原因.但这对你没有任何用处.因为引用过程类型没有继承.因此,唯一可以满足特定参考过程类型约束的是特定类型的东西.

实际上您的类型无法实例化.那是因为约束

T: TProc1,TProc2

指定T支持这两个引用过程接口.没有什么能做到的.没有什么能同时支持TProc1和TProc2.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读