加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 具有不同签名的功能指针(例如:带有默认值的可选参数)

发布时间:2020-12-15 04:17:31 所属栏目:大数据 来源:网络整理
导读:是否可以使用默认参数创建一个函数指针 TFunctionPointer = function(sName:AnsiString; tOptional: TObject = nil):smallint; 我想要实现的目标: 一个函数指针,可以接受类型的函数 function A(sName:AnsiString) 要么 function B(sName:AnsiString,tOption
是否可以使用默认参数创建一个函数指针
TFunctionPointer = function(sName:AnsiString; tOptional: TObject = nil):smallint;

我想要实现的目标:

一个函数指针,可以接受类型的函数

function A(sName:AnsiString)

要么

function B(sName:AnsiString,tOptional: TObject)

我怎样才能做到这一点?

解决方法

默认参数只是一个语法糖 – 实际上函数调用有两个参数.

但是您可以使用函数引用和匿名方法来创建此类函数指针 – 函数适配器.

type
  fnA = function(const sName: AnsiString): integer;
  fnB = function(const sName: AnsiString; const tOptional: TObject); integer;

  fnRef = reference to function(const sName: AnsiString; const tOptional: TObject): integer;

  fnBridge = record 
     Bridge: fnRef;
     class operator Implicit(fn: fnA): fnBridge;
     class operator Implicit(fn: fnB): fnBridge;
  end;

class operator fnBridge.Implicit(fn: fnA): fnBridge;
begin
  Result.Bridge := 
     function(const sName: AnsiString; const tOptional: TObject): integer
     begin
       Result := fn(sName); 
     end;
end;

class operator fnBridge.Implicit(fn: fnB): fnBridge;
begin
  Result.Bridge := 
     function(const sName: AnsiString; const tOptional: TObject): integer
     begin
       Result := fn(sName,tOptional); 
     end;
end;

function A(const sName: AnsiString): integer; 
begin Result := Length(sName) end;

function B(const sName: AnsiString; const tOptional: TObject): integer; 
begin Result := Length(sName) - Length(tOptional.ClassName) end;

function Consumer (const Param1,Param2: integer; const Action: fnBridge): integer;
begin
  Result := Param1 + Param2 * Action.Bridge('ABCDE',Application);
end;

....
  ShowMessage( IntToStr( Consumer(10,20,A) ));
  ShowMessage( IntToStr( Consumer(10,B) ));

PS:由于未指定Delphi版本,这意味着任何Delphi版本的答案都适合.从Delphi 2009及更高版本开始,此方法应该是hany版本.

PPS:对具有捕获变量的函数的引用在内部实现为TInterfacedObject后代.总的来说,这只是使用“高阶函数”的“战略模式”的简化案例

> http://en.wikipedia.org/wiki/Strategy_pattern
> http://en.wikipedia.org/wiki/Higher-order_function

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读