Function overloading by return type?
对返回类型的函数重载有一个非常详细的答案,并且我可以看到Delphi不允许这样做,但有没有任何变通方法可以根据Delphi中的不同返回类型重载函数?
答案 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;