Не работает перегрузка функций (Delphi 10.4.2 Sydney)

Не работает перегрузка функций. Пример. Всё время вызывается перегруженная функция TBase.Create(Value: LongWord), вне зависимости от передаваемого параметра в Delphi 10.4.2 Sydney, в Delphi 7 всё работает корректно, т.е. в зависимости от передаваемого параметра вызывается соответствующая перегруженная функция.

TTypeFunc = function: LongWord of object;
 
TBase=class 
protected
    fFuncValue: TTypeFunc;
    fValue: LongWord;
public
    constructor Create (Func: TTypeFunc); overload;
    constructor Create (Value: LongWord); overload;
end;
 
TForm1 = class(TForm)
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
private
  fBaseProp: TBase;
  function getValue: LongWord;
public
end;
 
constructor TBase.Create(Func:TTypeFunc);
begin
 fFuncValue := Func;
 fValue := 0;
end;
 
constructor TBase.Create(Value: LongWord);
begin
 fFuncValue := nil;
 fValue := Value;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  //!!! Идет вызов TBase.Create(Value: LongWord) а не TBase.Create(Func:TTypeFunc)
  fBitProp := TBase.Create(getDParams);
end;

Ответы (1 шт):

Автор решения: MBo

Вы не предоставили минимальный рабочий код, приведённый не компилируется.

Вызов TBase.Create(getValue); приводит к вызову функции, её результат LongWord, и соответственно вызывается второй вариант.

А если сделать так, то первый:

procedure TForm1.Button1Click(Sender: TObject);
var
  t: TTypeFunc;
begin
  t := getValue;
  fBaseProp := TBase.Create(t);
end;

Кроме того, конструкторы могут иметь разные имена, например CreateWithFunc - ведь данном случае не видно выгоды иметь одно имя.

В случаях, когда регулярную функцию можно спутать с её результатом, иcпользуется синтаксис @func, но с методом объекта не выйдет.

→ Ссылка