Delphi 2009 中的匿名方法(reference to) 研究

 之前我们可以定义方法类型, 然后通过方法类型的变量来使用方法, 譬如:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Type
  TFun = function(const num: Integer): Integer; {先定义一个方法类型}

  function MySqr(const num: Integer): Integer;  {再创建一个吻合上面类型的一个方法}
  begin
    Result := num * num;
  end;

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

{测试} procedure TForm1.FormCreate(Sender: TObject); var fun: TFun; {方法变量} n: Integer; begin fun := MySqr; {给变量赋值为相同格式的方法} n := fun(9); {现在这个方法变量可以使用了} ShowMessage(IntToStr(n)); {81} end; end.
之所以这样做, 是因为有时需要把 "方法" 当作参数, 譬如:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Type
  TFun = function(const num: Integer): Integer; {先定义一个方法类型}

  function MySqr(const num: Integer): Integer;  {再创建一个吻合上面类型的一个方法}
  begin
    Result := num * num;
  end;

  {把方法当作参数的方法}
  procedure MyProc(var x: Integer; fun: TFun);
  begin
    x := fun(x);
  end;

{测试}
procedure TForm1.FormCreate(Sender: TObject);
var
  n: Integer;
begin
  n := 9;
  MyProc(n, MySqr);
  ShowMessage(IntToStr(n)); {81}
end;

end.

  
  
现在 Delphi 2009 可以使用匿名方法了(使用 reference 定义方法类型, 然后在代码中随用随写方法), 譬如:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Type
  TFun = reference to function(const num: Integer): Integer; {用 reference 定义匿名方法类型}

procedure TForm1.FormCreate(Sender: TObject);
var
  fun: TFun;
  n: Integer;
begin
  {求平方}
  fun := function(const a: Integer): Integer {注意本行最后不能有 ; 号}
  begin
    Result := a * a;
  end;

  n := fun(9);
  ShowMessage(IntToStr(n)); {81}

  {求倍数}
  fun := function(const a: Integer): Integer
  begin
    Result := a + a;
  end;

  n := fun(9);
  ShowMessage(IntToStr(n)); {18}
end;

end.

  
  
把匿名方法当作其他方法的参数:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Type
  TFun = reference to function(const num: Integer): Integer;

  function FunTest(const n: Integer; fun: TFun): string;
  begin
    Result := Format('%d, %d', [n, fun(n)]);
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  f: TFun;
  s: string;
begin
  f := function(const a: Integer): Integer {注意本行最后不能有 ; 号}
  begin
    Result := a * a;
  end;

  s := FunTest(9, f);

  ShowMessage(s); {9, 81}
end;

end.
Delphi中,回调函数通常使用匿名方法或接口来实现。下面是使用匿名方法和接口的两种常见方式: 1. 使用匿名方法: 在Delphi中,可以使用匿名方法作为回调函数。匿名方法是一种没有名称的方法,可以直接在需要的地方定义和使用。以下是使用匿名方法实现回调函数的示例代码: ```delphi type TCallback = reference to procedure(const AValue: Integer); procedure DoSomethingWithCallback(ACallback: TCallback); begin // 执行某些操作 // 调用回调函数 ACallback(42); end; procedure Main; begin DoSomethingWithCallback( procedure(const AValue: Integer) begin // 在这里处理回调函数的逻辑 Writeln('Callback value: ', AValue); end ); end; ``` 2. 使用接口: 另一种常见的方式是使用接口来实现回调函数。首先,定义一个包含回调方法的接口,然后实现该接口并将其传递给需要回调的函数。以下是使用接口实现回调函数的示例代码: ```delphi type ICallback = interface procedure Callback(const AValue: Integer); end; type TCallbackImpl = class(TInterfacedObject, ICallback) procedure Callback(const AValue: Integer); end; procedure DoSomethingWithCallback(ACallback: ICallback); begin // 执行某些操作 // 调用回调函数 ACallback.Callback(42); end; procedure TCallbackImpl.Callback(const AValue: Integer); begin // 在这里处理回调函数的逻辑 Writeln('Callback value: ', AValue); end; procedure Main; var CallbackImpl: TCallbackImpl; begin CallbackImpl := TCallbackImpl.Create; try DoSomethingWithCallback(CallbackImpl); finally CallbackImpl.Free; end; end; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值