匿名函数和委托实现
# 匿名函数
匿名函数即没有函数名称的函数,个人的理解匿名函数在一定程度上提升代码的复用性
具体的使用方式如下(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
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
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