跟着老侯玩编程 跟着老侯玩编程
首页
  • 基础语法
  • 网络编程
  • 设计模式
  • 基础篇
  • 进阶篇
  • 框架篇
  • Redis
  • Alibaba
  • 课程目录
  • 码农宝典
留言
首页
  • 基础语法
  • 网络编程
  • 设计模式
  • 基础篇
  • 进阶篇
  • 框架篇
  • Redis
  • Alibaba
  • 课程目录
  • 码农宝典
留言
  • 基础语法

    • 单元文件
    • 变量和常量
    • 内联变量
    • 基本数据类型
    • 复合数据类型
    • 语句(选择语句)
    • 语句(循环语句)
    • 数组
    • 初识例程
    • 初识面向对象
    • 属性Property
    • 面向对象的方法
    • 指针
    • 接口
    • 匿名函数和委托实现
      • 匿名函数
      • 委托实现
    • 多态
    • 字符串详解
    • 异常处理
    • 反射机制
    • 泛型容器
    • JSON
    • 文件操作
    • Dll创建并调用
    • DLL初始化和退出处理
    • Package
    • 理解消息循环
    • VCL与Windows消息
    • 钩子原理
    • 进程通讯-内存映像
    • 多线程开篇
    • 线程控制
    • 线程同步
  • 网络编程

    • 网络编程基础
    • Delphi网络编程
    • select
    • WSAAsyncSelect
    • WSAEventSelect
  • 设计模式

    • 单例模式
    • 单例模式二
    • 策略模式
    • 简单工厂模式
    • 建造者模式
    • 原型模式
    • 模板方法模式
    • 状态模式
    • 迭代器模式
    • 解释器模式
    • 责任链模式
    • 中介者模式
    • 备忘录模式
    • 命令模式
    • 观察者模式
    • 访问者模式
    • 适配器模式
    • 桥接模式
  • Delphi
  • 基础语法
舞动的代码
2022-05-05
目录

匿名函数和委托实现

# 匿名函数

匿名函数即没有函数名称的函数,个人的理解匿名函数在一定程度上提升代码的复用性

具体的使用方式如下(DelphiXE10.x环境)


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

    // 该函数整体被作为一个参数传递
function Demo1(Age: Integer): Integer;
begin

    Writeln(Age);

    Result := Age;
end;

// 把函数当做一个对象进行传递
function Demo2(num1, num2: Integer; fun: TFun): Integer;
begin

    Result := fun(num1 + num2);
end;

var
    NumResult
begin

    NumResult := Demo2(10, 20,
        function(num: Integer): Integer
        begin
            Result := num;
        end);

    Writeln(NumResult);
    //第二种方式
    Writeln(Demo2(1, 2, Demo1));
    Readln;

end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

# 委托实现

委托其实不过是函数指针类型而已,在.NET因为没有了指针,就有了委托的概念.。在Delphi和C++中其实就是函数指针类型. Delphi还可以支持成员函数指针类型

下面的代码实现了接口的委托实现,如果你玩的是函数,那么理论上是相通的,只需要改变对应的类型即可

type
    { 吃东西的接口 }
    IEat = interface
        procedure EatIng();
    end;

    {狗是需要实现接口,重写其中的抽象函数}
    TDog = class(TInterfacedObject, IEat)
        procedure EatIng();
    end;

    { 猫类本来应该实现IEat接口中的抽象方法的,但是它没有实现而是委托给了狗实现 }
    TCat = class(TInterfacedObject, IEat)

    private
        FEat: IEat;
    public
        { 这一句是核心,即通过这种方式显示的委托 }
        property Eat: IEat read FEat write FEat implements IEat;
    end;

procedure TDog.EatIng;
begin
    Writeln('狗吃东西');
end;

var
    Cat: TCat;

begin
    Cat := TCat.Create();

    //这里必须要给 Eat 字段赋值否则就是空值
    //同时可以理解为真正实现吃东西的那条狗
    Cat.Eat := TDog.Create();

    Cat.Eat.EatIng;
    Readln;

end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
接口
多态

← 接口 多态→

Theme by Vdoing | Copyright © 2013-2023 冀ICP备16006233号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×