如何在Delphi中将函数作为参数传递给过程?

13

是否可能将对象函数作为参数传递给过程,而不是传递整个对象?

我有一个记录定义,其中包含已定义为公共类参数的函数:

    TMyRecord = record
      public
        class function New(const a, b: Integer): TMyRecord; static;
        function GiveMeAValue(inputValue: integer): Single;
      public
        a, b: Integer;
      end;

这个函数可能是这样的:

    function TMyRecord.GiveMeAValue(inputValue: Integer): Single;
    begin
      RESULT := inputValue/(self.a + self.b);
    end;

我希望定义一个过程,调用类函数GiveMeAValue,但我不想把整个记录都传入进去。例如,我可以这样做吗:

    Procedure DoSomething(var1: Single; var2, var3: Integer, ?TMyRecord.GiveMeAValue?);
    begin
      var1 = ?TMyRecord.GiveMeAValue?(var2 + var3);
      //Do Some Other Stuff
    end;
如果是这样的话,那我应该如何正确地将函数作为过程参数传递?
1个回答

24

你可以像下面这样为函数定义一个新的类型:

TGiveMeAValue= function(inputValue: integer): Single of object;// this definition works fine for methods for records.

然后定义方法DoSomething

Procedure DoSomething(var1: Single; var2, var3: Integer;GiveMeAValue: TGiveMeAValue);
begin
  writeln(GiveMeAValue(var2 + var3));
end;

然后像这样使用

var
  L : TMyRecord;
begin
    l.a:=4;
    l.b:=1;
    DoSomething(1, 20, 5, L.GiveMeAValue);
end;

2
另外,还可以使用匿名方法。这可以让您在匿名方法中调用任何喜欢的函数。http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/anonymousmethods_xml.html - Warren P
3
匿名方法使代码更加灵活,但它们可能会影响性能。不要排斥它们,但如果在程序的瓶颈区域使用匿名方法,可能会导致性能问题。 - David Heffernan
好观点。我个人认为procedure-or-function of object语法比reference to procedure-or-function of object语法更易读。在一行内编写procedure (a,b,c:Integer) begin ... end开始变得丑陋。 - Warren P
你的方法引用使用了“Single of object”而不是只使用“of object”。你是在告诉它将Self指针放入Single中吗? - Noumenon
我实际上在提问之前花了很长时间研究“of object”和方法引用,但我从未见过有人在“of object”之前插入像“Single”这样的数字类型。那是什么意思? - Noumenon
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接