Je voudrais déclarer un dossier générique comme ceci:Quelle contrainte générique dois-je utiliser pour un type de méthode anonyme?
type
TMyDelegate<T: constraint> = record
private
fDelegate: T;
public
class operator Implicit(a: T): TMyDelegate;
class operator Implicit(A: TMyDelegate: T);
end;
J'aimerais limiter T
-reference to procedure/function
. (Autant que possible).
J'ai essayé, mais il ne compile pas:
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.
Cela donne erreur de compilation:
[dcc32 Error] Project3.dpr(39): E2514 Type parameter 'T' must support interface 'TProc2'
est-il un moyen de contraindre un type générique (une liste de) types anonymes?
J'ai oublié que les contraintes sont ET ensemble, pas OR. – Johan
Les contraintes de procédure de référence sont en fait totalement inutiles. –
Vous pouvez créer une classe: THack = class (TInterfacedObject, TProc1, TProc2) répondant aux exigences. Je ne sais pas à quoi cela servirait, mais je suppose que vous pouvez le compiler. – Johan