不,它们不相同。
不同之处在于
TMathFn = function(A, B: Integer): Integer;
是一个普通的函数,
TMathMethod = function(A, B: Integer): Integer of object;
是一种方法,并且
TMathAnonMethod = reference to function(A, B: Integer): Integer;
是匿名方法,但您也可以将普通函数或方法分配给这种类型的变量。
因此,例如,如果
type
TMathFn = function(A, B: Integer): Integer;
TMathMethod = function(A, B: Integer): Integer of object;
TMathAnonMethod = reference to function(A, B: Integer): Integer;
function Test(A, B: Integer): Integer;
begin
Result := A + B;
end;
type
TTestClass = class
function Test(A, B: Integer): Integer;
end;
{ TTestClass }
function TTestClass.Test(A, B: Integer): Integer;
begin
Result := A + B;
end;
那么以下适用:
procedure TForm1.FormCreate(Sender: TObject);
var
T: TTestClass;
F: TMathFn;
M: TMathMethod;
AM: TMathAnonMethod;
begin
T := TTestClass.Create;
try
F := Test; // compiles
F := T.Test; // doesn't compile
F := function(A, B: Integer): Integer
begin
Result := A + B;
end; // doesn't compile
M := Test; // doesn't compile
M := T.Test; // compiles
M := function(A, B: Integer): Integer
begin
Result := A + B;
end; // doesn't compile
AM := Test; // compiles
AM := T.Test; // compiles
AM := function(A, B: Integer): Integer
begin
Result := A + B;
end; // compiles
finally
T.Free;
end;
end;
正如您可能已经知道的那样,在底层,F
它只是一个(函数)指针并且M
是一个方法指针。另一方面,匿名方法有一个更复杂的基于接口的实现,这允许它们的所有魔力(如变量捕获)。