2012-08-09 60 views
1

我在这里有一个问题:但问题是适用于任何方法重载。方法超载作为默认

我有一个方法声明,如:(巫不完全匹配的要求)

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) 

在这种情况下,两个方法声明是在视点编译相同:

这可能是问题的根源。如果没有这些案件,我会非常失望。 :(

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

+2

我不认为有一个“默认”重载说明符。什么是“单元”(一个类,一个枚举等)? – 2012-08-09 13:03:58

+0

当您调用该方法时,传入该方法的参数的类型是什么。显然你传递的是既不是整数也不是单位。 – 2012-08-09 13:19:53

回答

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) 
+0

是的,但是由于编译器错误,OP得到了“重载解析失败,因为没有可访问的'SetGridFormat'对于这些参数最为具体。 – 2012-08-09 13:23:11

+0

这有效......但不干净...我想我会改变声明有点避免这个问题:公共共享Sub SetGridFormat(ByRef网格作为DataGrid,ByVal宽度作为整数,ByVal高度作为整数,ByVal unitType作为UnitType,ByVal分页为布尔)。 – Minus 2012-08-09 15:28:22

0

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


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

,那么你将不得不使用DataType1 OR DataType2(或扩展他们某些类型)在您的通话yourMethod1(...)的参数,否则电话将失败。

在如果
DataType1 [extends DataType0];
DataType2 extends DataType1;

那么你对yourMethod1(...)延伸DataType2类型的任何参数都将执行调用yourMethod1(var1 as DataType2)执行yourMethod1(var1 as DataType1)的唯一方法是调用yourMethod1另一方面(...)有说法类型DataType1(或直接扩展DataType1 - 不通过DataType2)。

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) 

希望有所帮助。