有没有办法在Delphi中基于不同的Result类型重载函数?

时间:2010-01-23 21:35:58

标签: delphi function overloading

Function overloading by return type?

对返回类型的函数重载有一个非常详细的答案,并且我可以看到Delphi不允许这样做,但有没有任何变通方法可以根据Delphi中的不同返回类型重载函数?

3 个答案:

答案 0 :(得分:9)

记录的隐式和显式转换运算符允许按返回类型重载:即转换为的类型:

type
  TFoo = record
    class operator Implicit(const AFoo: TFoo): Integer;
    class operator Implicit(const AFoo: TFoo): string;
  end;

根据上下文,使用类型TFoo的值将调用适当的隐式转换。如果尝试使用类型TFoo的值作为重载例程的参数,该例程可以在该位置采用整数或字符串,则会发生重载错误:

test.pas(33) Error: E2251 Ambiguous overloaded call to 'Q'
 + Test.pas(19) Related method: procedure Q(Integer);
 + Test.pas(24) Related method: procedure Q(const string);

答案 1 :(得分:7)

您可以将“结果”作为参数。

procedure Blah( InVar : word; out OutVar : Byte ); overload;
procedure Blah( InVar : word; out OutVar : String ); overload;

答案 2 :(得分:1)

我采用了上述想法并在用于导入数据的tokenreader中实现了它。 每个标记都是一个字符串,然后将其转换为适当的类型。 转换为整数和字符串所需的代码位于帖子的底部。

要读取和转换令牌,只需要以下代码:

Myvalue := DataImporter.ImportToken;

根据Myvalue的类型,触发正确的隐式转换。


代码:

TTokenValue = record
public
  FValue:string;
  constructor Create(const AValue:string);
  class operator Implicit(const AFoo:TTokenValue): integer;
  class operator Implicit(const AFoo:TTokenValue): string;
end;

实施

function TDataImporter.ImportToken: TTokenValue;
begin
  result := TTokenValue.Create(GetCurrentToken());
end;

constructor TTokenValue.Create(const AValue: string);
begin
  FValue := AValue;
end;

class operator TTokenValue.Implicit(const AFoo: TTokenValue): integer;
begin
  result := strtointdef(AFoo.FValue, 0);
end;

class operator TTokenValue.Implicit(const AFoo: TTokenValue): string;
begin
  result:=AFoo.FValue;
end;