Обновлено:
Есть ли лучший способ сделать это?
TPendingBets = class(TDataModule)
private
public
function GetBdy(out IdEvent : Integer ) : Boolean; overload;
function GetBdy(out IdEvent : Integer; out idBetType : TBetTypes) : Boolean; overload;
function GetBdy(out IdEvent : Integer; out idBetType : TBetTypes; Out TotalOrgStake,Price : Double; out PriceError :Boolean): Boolean; overload;
end;
implementation
////////////////////
function TPendingBets.GetBdy(out IdEvent : Integer ): Boolean;
var idBetType : TBetTypes;
TotalOrgStake,Price : Double;
PriceError :Boolean;
begin
result := GetBdy(IdEvent,idBetType,TotalOrgStake,Price,PriceError);
end;
////////////////////
function TPendingBets.GetBdy(out IdEvent : Integer; out idBetType : TBetTypes): Boolean;
var TotalOrgStake,Price : Double;
PriceError :Boolean;
begin
result := GetBdy(IdEvent,idBetType,TotalOrgStake,Price,PriceError);
end;
////////////////////
function TPendingBets.GetBdy(out IdEvent : Integer; out idBetType : TBetTypes; Out TotalOrgStake,Price : Double; out PriceError :Boolean): Boolean;
begin
result := false;
if cdBdy.Eof = False then
begin
IdEvent := cdBdy.FieldByName(IdEvent ).AsInteger);
idBetType := TBetTypes(cdBdy.FieldByName(idBetType ).AsInteger);
//.
//.
result := True;
end;
end;
ПРИМЕЧАНИЕ:
Поскольку мой первоначальный вопрос был не очень ясным, я удалил его часть.





Я думаю, что решение с перегрузкой - неплохое решение, по крайней мере, таковое. Другие языки программирования требуют, чтобы вы объявляли функции с другими именами.
Другой подход может быть параметром динамического массива, например:
type
TExtendedDynArray = array of Extended; // if not already declared elsewhere
function Fn1(out arr: TExtendedDynArray): Boolean;
В дополнение к тому, что написал Уве (и я согласен, что перегрузка - лучшее решение здесь; проголосовали за), вы никогда не должны предполагать, что параметр out вообще имеет какое-либо значение в начале функции. Вот что значит "вне".
Вы можете использовать перегруженную функцию примерно так
функция Fn1 (Out A: строка; B: целое число = 5): логическое; перегрузка;
функция Fn1 (Out A: строка): логическое; перегрузка;
вы должны определить обе функции.
Да, это не сработает, потому что, если вы укажете только строку, она не сможет сказать, что вызывать.
Перегрузка не означает наличие 5 копий код в функции. У вас может быть 5 функций, но 4 из них просто позвони основная функция с правильными параметрами.
Мне вообще не нравятся параметры вне. Вы думали о возврате записи, содержащей все результаты?
Fn1Result = record
A: Extended;
B: Integer;
C, D, E, F: Extended
S: String;
end;
Затем объявите свою функцию как:
function Fn1: Fn1Result;
begin
Fn1.A := C_ConstA;
// etc. . . .
end;
Естественно, я предполагаю, что вы не используете выходные параметры в качестве входных. В справке Delphi:
An out parameter, like a variable parameter, is passed by reference. With an out parameter, however, the initial value of the referenced variable is discarded by the routine it is passed to. The out parameter is for output only; that is, it tells the function or procedure where to store output, but doesn't provide any input.
У меня странное ощущение, что вы используете выходные параметры в качестве входных. Не надо. Передайте их как вар, если хотите, чтобы они шли в обе стороны.
Значения по умолчанию можно использовать только для входных параметров (то есть по значению и константе). Для параметров var и out значения по умолчанию невозможны.
Как уже отмечал Джим: вы можете избежать дублирования кода, если большинство перегруженных функций вызовут ту, которая принимает все параметры, так что они будут просто тонкими слоями по сравнению с исходной функцией. Начиная с Delphi 2005, вы можете объявлять их встроенными, чтобы компилятор действительно мог генерировать более эффективный код.
Как показал Джим, вам не нужно копировать код при перегрузке.
Мне не очень нравится смешивать параметры со значениями по умолчанию, перегрузка а также, потому что (делая это без осторожности) вы можете создать беспорядок.
Обычно, если мне нужно поддерживать много синтаксисов:
1) Я определяю полную подпись с помощью ВСЕ ПАРАМЕТРЫ. Назовем это «мастер» один.
2) Все перегрузки вызывают это. Или звоните друг другу, но в конце концов каждый Цепочка перегрузки должна вызывать «главную» для выполнения задачи.
Для меня перегрузки - это «обработчики параметров» или «переводчики». Позже, если мне понадобится что-то, чтобы изменить основное поведение, я создаю новые параметры на «мастере» (которые могут иметь значения по умолчанию - на самом деле, в большинстве своем имеют).
Если мне нужна перегрузка с новым параметром, я создаю новый, и он просто передаю его в «мастерская» процедура. Побочным эффектом является то, что старые продолжают вести себя так же.
Я думаю, что это не сработает, поскольку вызов типа Fn1 (stringvar) неоднозначен. Компилятор не должен принимать это.