功能与Delphi中的程序(默认值和可选参数)

时间:2009-01-16 16:01:59

标签: delphi

编辑:

有更好的方法吗?

TPendingBets = class(TDataModule)
  private
  public
    function    GetBdy(out IdEvent : Integer                           )                                                           : Boolean; overload;
    function    GetBdy(out IdEvent : Integer; out idBetType : TBetTypes)                                                           : Boolean; overload;
    function    GetBdy(out IdEvent : Integer; out idBetType : TBetTypes; Out TotalOrgStake,Price : Double; out PriceError :Boolean): Boolean; overload;
  end;

implementation

////////////////////

function    TPendingBets.GetBdy(out IdEvent : Integer ): Boolean;
var idBetType : TBetTypes;
    TotalOrgStake,Price : Double;
    PriceError :Boolean;
begin
   result :=  GetBdy(IdEvent,idBetType,TotalOrgStake,Price,PriceError);
end;

////////////////////

function    TPendingBets.GetBdy(out IdEvent : Integer; out idBetType : TBetTypes): Boolean;
var TotalOrgStake,Price : Double;
    PriceError :Boolean;
begin
   result :=  GetBdy(IdEvent,idBetType,TotalOrgStake,Price,PriceError);
end;

////////////////////

function    TPendingBets.GetBdy(out IdEvent : Integer; out idBetType : TBetTypes; Out TotalOrgStake,Price : Double; out PriceError :Boolean): Boolean;
begin
    result :=  false;
    if cdBdy.Eof = False then
    begin
       IdEvent   :=   cdBdy.FieldByName(IdEvent ).AsInteger);
       idBetType :=   TBetTypes(cdBdy.FieldByName(idBetType ).AsInteger);
       //.
       //.
       result := True;
    end;  
end;

注意:

由于我最初的问题不是很明确,我已经删除了部分内容

6 个答案:

答案 0 :(得分:9)

重载并不意味着在函数中有5个代码副本。您可能有5个函数,但其​​中4个只需使用正确的参数调用主函数。

我通常不喜欢 out 参数。您是否考虑过返回包含所有结果的记录?

Fn1Result = record
  A: Extended;
  B: Integer;
  C, D, E, F: Extended
  S: String;
end;

然后声明你的函数:

function Fn1: Fn1Result;
begin
  Fn1.A := C_ConstA;
  // etc. . . .
end;

当然我假设您没有使用输出参数作为输入。根据Delphi的帮助:

  

out参数(如变量参数)通过引用传递。但是,使用out参数时,引用变量的初始值将被传递给它的例程放弃。 out参数仅用于输出;也就是说,它告诉函数或过程存储输出的位置,但不提供任何输入。

我觉得你使用输出参数作为输入参数很有趣。别。如果您希望它们双向传递,请将它们作为 var 传递。

答案 1 :(得分:5)

我认为过载解决方案是一个很好的解决方案,至少它是一个。其他编程语言要求您声明具有不同名称的函数。

另一种方法可能是动态数组参数,如:

type
  TExtendedDynArray = array of Extended;  // if not already declared elsewhere

function Fn1(out arr: TExtendedDynArray): Boolean;

答案 2 :(得分:2)

除了Uwe所写的内容(我同意重载是一个更好的解决方案;投票),你永远不应该假定out参数在函数开头有任何值。这意味着什么。

答案 3 :(得分:1)

你可以使用像这样的重载函数

function Fn1(Out A:string; B:integer = 5):boolean;过载;

function Fn1(Out A:string):boolean;过载;

你必须定义这两个功能。

答案 4 :(得分:1)

Jim所示,您无需在重载时复制代码。

我不喜欢将参数与默认值重载混合在一起,因为(无需小心),您可以制造混乱。

通常,如果我必须支持很多语法:

1)我使用 ALL PARAMETERS 定义完整的签名。我们称之为 '掌握'一个。

2)所有重载都会调用那个。或者一个接一个,但最后每个 重载链必须调用'master'来执行任务。

对我来说,重载是“参数计算器”或“翻译器”。后来,如果我需要的话 修改主行为的东西,我在'master'上创建新参数(可以有默认值 - 事实上,大多数都有)。

如果我需要使用新参数进行重载,我会创建一个新参数,然后将其传递给 “主”程序。副作用是旧的继续表现相同。

答案 5 :(得分:0)

默认值只能用于输入参数(即:按值和常量)。对于var和out参数,默认值是不可能的。

正如Jim已经指出的那样:你可以通过让大多数重载函数调用带有所有参数的函数来避免重复代码,因此它们只是原始函数的薄层。从Delphi 2005开始,您可以将它们内联声明,因此编译器实际上可能会生成更高效的代码。