扩张 delphi 泛型 以实现类似lambda功用 , C#中的an

来源:http://www.sh-fengwen.com 作者:家常菜谱 人气:80 发布时间:2019-09-23
摘要:推而广之 delphi 泛型 以实现类似lambda功效 , C#中的any count first last等扩充方法 在C#中对泛型的恢宏,输入参数是泛型本人的内容,重返值则是bool.基于那或多或少,发轫布局在delphi下怎么着达

推而广之 delphi 泛型 以实现类似lambda功效 , C#中的any count first last 等扩充方法

在C#中对泛型的恢宏,输入参数是泛型本人的内容,重返值则是bool.基于那或多或少,发轫布局在delphi下怎么着达成.

首先
1.delphi 是匡助无名函数的其语法为:
名称 = reference to 函数类型定义
例如:
TFun = reference to function(const num: Integer): Integer;

2.对泛型的扩展的语法如下:
TList<T> = class(Generics.Collections.TList<T>)
public
***********
end;

有了上述的两点,便能够完毕我们想要的功效了.其主要性思路为:
为泛型扩充的any count方法增添类型为"Ibool接口"的参数.Ibool接口类型的参数正是泛型自身的剧情,再次回到值则是Boolean

在调用这几个扩大时,只须要社团出贰个支撑Ibool接口的对像就可以了.

对此Ibool接口,帮助Ibool接口的对像,any等扩展方法之间的涉嫌请细细思考.对大师来说很简单了吗,正是三个粗略的安排性情势.

主要代码,注释如下:
unit UCryHelper;

interface
uses
Generics.Collections;
type
IBool<T>=interface //那正是Ibool接口的概念
function Compare: Boolean;
end;

TBoolsion<T> = reference to function( Right: T): Boolean;//匿名函数 因为是对泛型的支撑所以要有十分"T". 那几个的品类与Ibool接口方法的品类是同一的,定义成这么后,用那个无名函数连接你写的骨子里的函数体和泛型

TBool<T>=class(TInterfacedObject, IBool<T>) //那是支撑IBool接口的对像,那是虚函数,实际的实践者是底下的定义.
public
class function Construct(const EqualityComparison: TBoolsion<T>): IBool<T>;
function Compare: Boolean;virtual; abstract;
end;

TDelegatedBool<T> = class(TBool<T>) //前五个档期的顺序是必不可缺的花色,那行则是实在的实践者.
private
FEquals: TBoolsion<T>;
public
constructor Create(const AEquals: TBoolsion<T>);
function Compare: Boolean; overload; override;
end;

TList<T> = class(Generics.Collections.TList<T>) //那是对泛型的扩充,不用多说了.
public
type
TDynArray = array of T;
function ToArray: TDynArray;
function Any(const AComparer: IBool<T>):Boolean; //扩大方法Any的参数为IBool<T>重回值是Boolean
end;
implementation

function TList<T>.Any(const AComparer: IBool<T>): Boolean;
var
one:T;
begin
Result:=False;
for one in Self do
begin
if AComparer.Compare then
begin
Result:=True;
Exit;
end;
end;
end;

function TList<T>.ToArray: TDynArray;
var
I: Integer;
begin
SetLength(Result, self.Count);
for I := 0 to Self.Count - 1 do
begin
Result[I] := Self[I];
end;
end;
{ TBool<T> }

class function TBool<T>.Construct(const EqualityComparison: TBoolsion<T>): IBool<T>;
begin
Result:= TDelegatedBool<T>.Create(EqualityComparison);
end;

{ TDelegatedBool<T> }

function TDelegatedBool<T>.Compare: Boolean;
begin
Result := FEquals;
end;

constructor TDelegatedBool<T>.Create(const AEquals: TBoolsion<T>);
begin
FEquals:= AEquals;
end;
end.

最后的调用就是这样用了.先use UCryHelper 然后

procedure TfrmSampleInput.btnQuitClick(Sender: TObject);
var
listint:TList<Integer>;
boolCal:IBool<Integer>;
begin
inherited;
listint:=TList<Integer>.Create;
listint.Add;
listint.Add;
listint.Add;
listint.Add;

boolCal:=TBool<Integer>.Construct(
function ( Avalue: integer): Boolean
begin
result := Avalue=listint.Count;
end
);
if(listint.Any then
ShowMessage;
{倘诺想把boolCal:IBool<Integer>;的注解省了,那样用也是足以的,怎么着?和C#里的any方法许多吧.
if listint.Any(Tbool<Integer>.Construct(function(Avalue:Integer):Boolean
begin
result := Avalue=listint.Count;
end
)) then
ShowMessage;}
listint.Free;
end;

上述正是二个扩张any的落实,有了那几个any,再扩充count first last等另外措施还不就差非常少了?快试试吧.

本文由美高梅游戏平台网站发布于家常菜谱,转载请注明出处:扩张 delphi 泛型 以实现类似lambda功用 , C#中的an

关键词:

上一篇:开发者所需要知道的 iOS 9 SDK 新特性

下一篇:没有了

最火资讯