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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |