• Delphi


    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.

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

    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 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.

    参考:

    https://www.cnblogs.com/del/archive/2008/08/15/1268301.html

  • 相关阅读:
    Java设计模式--单列设计模式
    TCP服务器端和客服端(一)
    面向对象 ---Java抽象类
    全新的代码
    黑马程序员入学基础测试(五)
    mysql 权限管理
    centos7 端口开放
    centos7 yum 安装 mysql
    centos7 安装jdk
    centos7 yum 安装jq
  • 原文地址:https://www.cnblogs.com/sunylat/p/13954752.html
Copyright © 2020-2023  润新知