Есть ли способ перегрузить функцию, основанную на другом типе результата в Delphi? - PullRequest
6 голосов
/ 24 января 2010

Перегрузка функции по типу возврата?

содержит очень подробный ответ о рациональной перегрузке функций по типу возвращаемого значения, и, как я вижу, Delphi не позволяет этого, но есть ли обходные пути для перегрузки функции, основанной на другом типе возвращаемого значения в Delphi?

Ответы [ 3 ]

9 голосов
/ 24 января 2010

Операторы неявного и явного преобразования для записей допускают перегрузку по типу возвращаемого значения, а именно по типу, преобразуемому в:

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);
7 голосов
/ 24 января 2010

Вы можете принять «результат» в качестве параметра.

procedure Blah( InVar : word; out OutVar : Byte ); overload;
procedure Blah( InVar : word; out OutVar : String ); overload;
1 голос
/ 28 марта 2011

Я взял вышеуказанную идею и реализовал ее в программе чтения токенов, используемой для импорта данных. Каждый токен представляет собой строку, которая затем преобразуется в соответствующий тип. Код, необходимый для преобразования в целое число и строку, находится внизу поста.

Для чтения и преобразования токена необходим только следующий код:

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;
...