Не работает перегрузка функций (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 шт):
Вы не предоставили минимальный рабочий код, приведённый не компилируется.
Вызов TBase.Create(getValue); приводит к вызову функции, её результат LongWord, и соответственно вызывается второй вариант.
А если сделать так, то первый:
procedure TForm1.Button1Click(Sender: TObject);
var
t: TTypeFunc;
begin
t := getValue;
fBaseProp := TBase.Create(t);
end;
Кроме того, конструкторы могут иметь разные имена, например CreateWithFunc - ведь данном случае не видно выгоды иметь одно имя.
В случаях, когда регулярную функцию можно спутать с её результатом, иcпользуется синтаксис @func, но с методом объекта не выйдет.