#object #delphi #pascal
Вопрос:
Есть ли какой-либо способ пропустить параметры по умолчанию, скажем, предположим, что мое объявление метода выглядит следующим образом:
procedure MyProc1(var isAttr1: Boolean = FALSE;
var isAttr2: Boolean = FALSE; var isAttr3: Boolean = FALSE);
Я не могу вызвать функцию таким образом:
Self.MyProc1( , , Attr3);
поскольку мне не нужны ненужные объявления var, в то же время мне нужно последнее возвращаемое значение параметра (это тип var).
Заранее благодарю за помощь.
Комментарии:
1.
var
параметры не могут иметь значений по умолчанию (конечно!).2. И последний параметр не проходит мимо
var
, только первый.3. извините за то, что я отредактировал вопрос
4. Э-э, у вас не может быть значений по умолчанию для параметров var.
5. но PaxEngine (пакс-комплиер) позволяет мне это делать, и при этом код, не соответствующий курсу, ведет себя ненормально. Думал, чтобы избежать @David и @Andreas, вы правы
Ответ №1:
Извини, ты не можешь этого сделать. Более того, у вас не может быть var
параметра по умолчанию, как у вас есть isAttr1
.
Если бы ваши параметры имели достаточно разные типы параметров, вы могли бы использовать перегруженные методы в качестве альтернативы параметрам по умолчанию, что лично мне больше нравится. Но все ваши параметры являются логическими, и поэтому вы не можете сделать это здесь.
Другие плакаты предполагали что-то подобное:
procedure Myfunc1(var isAttr1, isAttr2, isAttr3: Boolean); overload;
procedure Myfunc1(var isAttr3: Boolean); overload;
Это будет компилироваться и работать, но будет противоречить принципу наименьшего удивления. Для перегруженных процедур, подобных этой, можно было бы ожидать, что для процедуры только с одним параметром этот единственный параметр будет первым параметром процедуры с несколькими параметрами. Другими словами, вы ожидали бы:
procedure Myfunc1(var isAttr1, isAttr2, isAttr3: Boolean); overload;
procedure Myfunc1(var isAttr1: Boolean); overload;
Ответ №2:
В этом случае следует использовать директиву перегрузки:
Директива перегрузки позволяет иметь разные версии одной и той же именованной функции или процедуры с разными аргументами.
Ответ №3:
Да, сделайте перегруженную версию myFunc1(isAttr3 : логическое значение = FALSE); перегрузка;
Пусть он придумает фиктивные параметры и передаст их вам.
Как указывает другой плакат, вы можете сделать это с помощью VAR.
Кроме того, неправильно называть это myFunc, если это не функция. Назови это MyProc!
Мое решение:
function ov(p1 : boolean; p2 : boolean; p3 : boolean) : boolean; overload;
begin
result := p1 or p2 or p3;
end;
function ov(p3 : boolean) : boolean; overload;
begin
result := ov(false, false, p3);
end;
Теперь у вас есть выбор:
ov(TestBool3)
или
ov(TestBool1, TestBool2, TestBool3)
Комментарии:
1. Но это не сработает из — за неоднозначности параметров-другая перегрузка имеет 3 логических параметра, все со значениями по умолчанию.
2. Я бы отказался от значений по умолчанию и параметра var и просто сделал бы его функцией, возвращающей логическое значение. Я считаю, что у вас может быть две перегруженные версии, одна с одним параметром, другая с 3.
3. @Chris это правильно, но есть и другие проблемы при рассмотрении вопроса в том виде, в каком он был задан; см. правку моего ответа
4. Я не хочу объявлять ненужные переменные, потому что это будет отклонено в обзоре кода, реальная концепция заключается в том, что процедура (функция-извините) будет вызвана в трех разных вариантах. сценарии и использовать эти три параметра var соответственно, я не могу снова написать три перегруженные функции
5. @Vijay Если вы не можете использовать 3 перегрузки и у вас не может быть неиспользуемых переменных, то вам, похоже, придется сдаться.