跳过Delphi中的默认参数

跳过Delphi中的默认参数,delphi,Delphi,有没有办法跳过默认参数,假设我的方法声明如下: procedure MyProc1(var isAttr1: Boolean = FALSE; var isAttr2: Boolean = FALSE; var isAttr3: Boolean = FALSE); Self.MyProc1( , , Attr3); procedure Myfunc1(var isAttr1, isAttr2, isAttr3: Boolean); overload; procedure Myfunc

有没有办法跳过默认参数,假设我的方法声明如下:

procedure MyProc1(var isAttr1: Boolean = FALSE;
    var isAttr2: Boolean = FALSE; var isAttr3: Boolean = FALSE);
Self.MyProc1( , , Attr3);
procedure Myfunc1(var isAttr1, isAttr2, isAttr3: Boolean); overload;
procedure Myfunc1(var isAttr3: Boolean); overload;
我不能这样调用函数:

procedure MyProc1(var isAttr1: Boolean = FALSE;
    var isAttr2: Boolean = FALSE; var isAttr3: Boolean = FALSE);
Self.MyProc1( , , Attr3);
procedure Myfunc1(var isAttr1, isAttr2, isAttr3: Boolean); overload;
procedure Myfunc1(var isAttr3: Boolean); overload;
因为我不需要不必要的var声明,同时我需要最后一个param返回值(它是一个var类型)


提前感谢您的帮助。

对不起,您不能这样做。更重要的是,您不能像使用
isAttr1
那样使用默认值的
var
参数

如果您的参数具有足够不同的参数类型,那么您可以将其用作默认参数的替代方法,这是我个人更喜欢的技术。但是你的参数都是布尔值,所以你不能在这里这么做

其他海报也提出了类似的建议:

procedure MyProc1(var isAttr1: Boolean = FALSE;
    var isAttr2: Boolean = FALSE; var isAttr3: Boolean = FALSE);
Self.MyProc1( , , Attr3);
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;

是,创建MyFunc1的重载版本(isAttr3:boolean=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)

在这种情况下,您应该使用指令:

重载指令允许您 有相同的不同版本 使用 不同的论点


var
参数不能有默认值(当然!)。最后一个参数没有通过
var
传递,只有第一个参数是。很抱歉,我编辑了提问者,您不能有var参数的默认值。但是PaxEngine(Pax complier)允许我这样做,而非课程代码在这方面表现异常。我想避免使用@David和@Andreas,你说得对,但这不起作用,因为参数不明确-另一个重载有3个布尔参数,都是默认值。我会放弃默认值和var参数,只让它成为一个返回布尔值的函数。我相信你可以有两个重载版本,一个有一个参数,一个有3个参数。@Chris这是正确的,但在处理提出的问题时还有其他问题;请参阅对我的回答的编辑我不想声明不必要的变量,因为这将在代码审查中被拒绝,真正的概念是(函数——对不起)过程将在三种不同的场景中调用,并相应地使用这三个var参数,我不能写三个重载函数again@Vijay如果你不能使用3个重载,也不能使用未使用的变量,那么看起来你必须放弃。