方法重载为默认值

时间:2012-08-09 13:01:14

标签: vb.net overloading

我在这里遇到了一些问题:但问题适用于任何方法重载。

我有一个方法声明,如:(女巫完全不符合要求)

Public Shared Sub SetGridFormat(ByRef grid As DataGrid, ByVal width As Integer, ByVal height As Integer, ByVal paging As Boolean)

所以我想到为我需要这个的情况写一个重载:

   Public Shared Sub SetGridFormat(ByRef grid As DataGrid, ByVal width As Unit, ByVal height As Unit, ByVal paging As Boolean)

两个声明是相同的,但高度和宽度的类型。我得到了一个“重载解析失败,因为没有可访问的'SetGridFormat'对这些参数最具体”错误。

问题是:vb.net是否允许“默认”定义方法,以防案例构建器无法决定使用哪一个以及语法是什么?

帮助坦克。

编辑:2个电话看起来像是:

SetGridFormat(dg, New Unit(100, UnitType.Percentage), New Unit(100, UnitType.Percentage), True)
SetGridFormat(dg, 100, 100,True)

从回复中,我只需要指定一些内容:大多数答案在大多数情况下都有效,但排除了我必须处理的问题,可以将2个值设置为空(不需要特定大小) )。

SetGridFormat(dg, Nothing, Nothing, True)

在这种情况下,两种方法声明在编译器的角度都是相同的:

这可能是问题的根本原因。如果这些案件不存在,我会非常失望。 :(

我的问题是在这种情况下是否有办法强制编译器使用特定的方法调用?

3 个答案:

答案 0 :(得分:1)

我认为没有默认说明符,但您不需要指定默认值,因为编译器将根据参数类型决定调用哪一个:

请考虑以下事项:

Dim dg as DataGrid = Nothing
Dim widthInt as Integer = 0, HeightInt as Integer = 0
Dim pg as Boolean = False
Dim widthUnit as Unit = "Defaultvalue", heightUnit as Unit = "Defaultvalue"

SetGridFormat(dg, widthInt, heightInt, pg) ' Calls your first method
SetGridFormat(dg, widthUnit, heightUnit, pg) ' Calls your second method

如果您确实需要,可以通过将类型转换为所需类型来强制编译器使用特定方法(如果对象无法转换为所需类型,则显然会失败):

SetGridFormat(dg, CType(AnyObject,Integer), CType(AnyObject,Integer), pg) ' Calls your first method
SetGridFormat(dg, CType(AnyObject,Unit), CType(AnyObject,Unit), pg) ' Calls your first method

因此,在您要使用Nothing调用特定方法的情况下,可以执行此操作:

SetGridFormat(dg, CType(Nothing,Integer), CType(Nothing,Integer), pg) ' Calls your first method
SetGridFormat(dg, CType(Nothing,Unit), CType(Nothing,Unit), pg) ' Calls your first method

但是这对我来说似乎是糟糕的设计,因为使用Nothing作为参数调用其中一个应该具有相同的效果,因此在这个实例中调用哪一个应该无关紧要所以我想你应该真正定义一个新的重载:

Public Shared Sub SetGridFormat(ByRef grid As DataGrid, ByVal paging As Boolean)

答案 1 :(得分:1)

当然无法指定默认值。但是,您可以使用以下语法执行缩小转换(如果我已正确阅读了问题):

Public Shared Sub SetGridFormat(ByRef grid As DataGrid, ByVal iWidth As Integer, ByVal iHeight As Integer, ByVal paging As Boolean)
Public Shared Sub SetGridFormat(ByRef grid As DataGrid, ByVal uWidth As Unit, ByVal uHeight As Unit, ByVal paging As Boolean)

SetGridFormat(dg, iWidth:=50, iHeight:=50, true)
SetGridFormat(dg, uWidth:=50, uHeight:=50, true)

希望有所帮助。

答案 2 :(得分:0)

不,所使用的方法必须由您定义,它将是所使用参数的最具体(关闭类型)。
如果你有 yourMethod1(var1 as DataType1);
yourMethod1(var1 as DataType2);


DataType1 [extends DataType0];
DataType2 [extends DataType0];

然后,您将需要在调用yourMethod1(...)时使用DataType1或DataType2(或某些类型扩展它们)参数,否则调用将失败。

另一方面,如果
DataType1 [extends DataType0];
DataType2 extends DataType1;

然后使用任何类型扩展DataType2的参数调用yourMethod1(...)将执行yourMethod1(var1 as DataType2)执行yourMethod1(var1 as DataType1)的唯一方法是使用参数调用yourMethod1(...)输入DataType1(或直接扩展DataType1 - 不通过DataType2)。