• 普通方法、类的方法、匿名方法 做参数


    1.普通方法做参数:

    如果方法 是类的方法,那么就不能当函数的参数了,编译会报错,就是说 类的方法的指针 与 普通方法的指针是有区别的,毕竟类的方法的指针 可能包含了 面向对象的 继承 覆盖 等信息;

    2.类的方法做参数,就是说类的方法的类型要加上 of object:

     

    3.匿名方法 做参数,要加上 reference to

    最终的调试代码:

    unit Unit6;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
    
    type
    
      /// <summary>
      /// 普通方法类型
      /// </summary>
      TPuTongFun = function(const num: Integer): Integer;
    
      /// <summary>
      /// 类的方法的类型
      /// </summary>
      TObjectFun = function(const num: Integer): Integer of object;
    
      /// <summary>
      /// 匿名方法的类型
      /// </summary>
      TNiMingFun = reference to function(const num: Integer): Integer;
    
      TForm6 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        /// <summary>
        /// 类的方法
        /// </summary>
        function puTongFun3(const num: Integer): Integer;
      end;
    
    var
      Form6: TForm6;
    
    implementation
    
    {$R *.dfm}
    
    function puTongFun1(const num: Integer): Integer;
    begin
      //加法
      Result := num + num;
    end;
    
    function puTongFun2(const num: Integer): Integer;
    begin
      //乘法
      Result := num * num;
    end;
    
    function TForm6.puTongFun3(const num: Integer): Integer;
    begin
      //乘以5
      Result := num * 5;
    end;
    
    //用普通方法做参数的方法
    function abc(const x: Integer; AFun: TPuTongFun): string;
    begin
      Result := (AFun(x) + 1).ToString;
    end;
    
    //用类的方法做参数的方法
    function abcObject(const x: Integer; AFun: TObjectFun): string;
    begin
      Result := (AFun(x) + 1).ToString;
    end;
    
    //匿名方法类型做参数
    function abcNiMing(const x: Integer; AFun: TNiMingFun): string;
    begin
      Result := (AFun(x) + 1).ToString;
    end;
    
    procedure TForm6.Button1Click(Sender: TObject);
    var
      pu1,pu2: TPuTongFun;
      pu3: TObjectFun;
      pu4: TNiMingFun;
    begin
      //初始化实例(可以根据情况选择方法的实例)
      pu1 := puTongFun1;{用加法}
      pu2 := puTongFun2;{用乘法}
      pu3 := puTongFun3;{类的方法-乘以5}
    
      //匿名方法的实例创建
      pu4 := function(const num: Integer): Integer {注意本行最后不能有 ; 号}
      begin
        Result := num * 6;
      end;
    
    
      //结果
      ShowMessage(abc(3, pu1)); {7}
      ShowMessage(abc(3, pu2)); {10}
      ShowMessage(abcObject(3, pu3)); {16}
      ShowMessage(abcNiMing(3, pu4)); {19}
    end;
    
    
    end.
  • 相关阅读:
    端口被sysmtem占用
    windows 服务器恢复选项恢复
    服务端相关知识学习(二)之Zookeeper可以干什么
    服务端相关知识学习(一)之什么是zookeeper
    whistle学习(二)之启动、停止、重启、更新whistle等命令
    whistle学习(一)之安装、使用、软件功能了解
    动画方案 Lottie 学习(二)之实战
    动画方案 Lottie 学习(一)之基础
    移动端真机debug调试神器 vConsole学习(二)之实战
    移动端真机debug调试神器 vConsole学习(一)之基础
  • 原文地址:https://www.cnblogs.com/del88/p/6929079.html
Copyright © 2020-2023  润新知