Есть ли способ перегрузить функцию на основе другого типа результата в Delphi?

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

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


person HMcG    schedule 23.01.2010    source источник


Ответы (3)


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

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);
person Barry Kelly    schedule 24.01.2010
comment
Ну, не совсем тот ответ, на который я надеялся, но все равно интересно. Ваше здоровье. - person HMcG; 24.01.2010

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

procedure Blah( InVar : word; out OutVar : Byte ); overload;
procedure Blah( InVar : word; out OutVar : String ); overload;
person Kornel Kisielewicz    schedule 23.01.2010
comment
Да, я мог бы это сделать, но я обновляю компонент, а метод в настоящее время реализован как функция, поэтому, если я перейду к вызову процедуры, мне придется вернуться через весь вызывающий его код. - person HMcG; 24.01.2010

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

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

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;
person Sharken    schedule 28.03.2011