2012-08-09 36 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) 

希望有所幫助。