我想声明一个通用的记录,像这样:我对匿名方法类型使用什么通用约束?
type
TMyDelegate<T: constraint> = record
private
fDelegate: T;
public
class operator Implicit(a: T): TMyDelegate;
class operator Implicit(A: TMyDelegate: T);
end;
我想限制T
到reference to procedure/function
。 (越多越好)。
我想这一点,但它并不编译:
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'
有没有办法约束泛型类型(名单)匿名类型?
我忘记了约束条件AND'ed在一起,而不是OR'ed。 – Johan
事实上,参考程序约束完全没有用处。 –
您可以创建一个类:THack = class(TInterfacedObject,TProc1,TProc2),以满足要求。不知道它的用途是什么,但我猜你可以编译它。 – Johan