Általános eljárások a Visual Basicben
Az általános eljárás, más néven általános módszer egy legalább egy típusparaméterrel definiált eljárás. Ez lehetővé teszi, hogy a hívó kód az eljárás minden hívásakor az adattípusokat a követelményekhez igazítsuk.
Az eljárás nem általános, csupán azért, mert egy általános osztályban vagy egy általános struktúrában van definiálva. Általánosnak kell lennie, az eljárásnak legalább egy típusparamétert kell alkalmaznia, az esetleges normál paraméterek mellett. Egy általános osztály vagy struktúra tartalmazhat nemgenerikus eljárásokat, és egy nemgenerikus osztály, struktúra vagy modul általános eljárásokat is tartalmazhat.
Egy általános eljárás használhatja a típusparamétereket a normál paraméterlistában, a visszatérési típusában, ha van ilyen, és az eljárás kódjában.
Típuskövetkeztetés
Általános eljárást úgy hívhat meg, hogy egyáltalán nem ad meg típusargumentumokat. Ha így hívja meg, a fordító megkísérli meghatározni a megfelelő adattípusokat az eljárás típusargumentumainak való továbbításhoz. Ezt típuskövetkeztetésnek nevezzük. Az alábbi kód egy olyan hívást mutat be, amelyben a fordító arra következtet, hogy a típust String
a típusparaméternek t
kell átadnia.
Public Sub testSub(Of t)(ByVal arg As t)
End Sub
Public Sub callTestSub()
testSub("Use this string")
End Sub
Ha a fordító nem tudja a hívás kontextusából kikövetkeztetni a típusargumentumokat, hibát jelez. Egy ilyen hiba egyik lehetséges oka a tömb rangjának eltérése. Tegyük fel például, hogy egy normál paramétert egy típusparaméter tömbjeként definiál. Ha egy másik rangot (dimenziók számát) tartalmazó tömböt tartalmazó általános eljárást hív meg, az eltérés a típusbeli következtetés meghiúsulását okozza. Az alábbi kód egy olyan hívást mutat be, amelyben egy kétdimenziós tömböt egy egydimenziós tömbre váró eljárásnak adnak át.
Public Sub demoSub(Of t)(ByVal arg() As t)
End Sub
Public Sub callDemoSub()
Dim twoDimensions(,) As Integer
demoSub(twoDimensions)
End Sub
A típuskövetkeztetést csak az összes típusargumentum kihagyásával hívhatja meg. Ha egy típusargumentumot ad meg, az összeset meg kell adnia.
A típuskövetkeztetés csak általános eljárások esetén támogatott. Nem hívhat meg típuskövetkezményeket általános osztályokon, struktúrákon, felületeken vagy meghatalmazottakon.
Példa
Leírás
Az alábbi példa egy általános Function
eljárást határoz meg egy tömb adott elemének megkereséséhez. Egy típusparamétert határoz meg, és a paraméterlistában a két paraméter létrehozásához használja.
Kód
Public Function findElement(Of T As IComparable) (
ByVal searchArray As T(), ByVal searchValue As T) As Integer
If searchArray.GetLength(0) > 0 Then
For i As Integer = 0 To searchArray.GetUpperBound(0)
If searchArray(i).CompareTo(searchValue) = 0 Then Return i
Next i
End If
Return -1
End Function
Megjegyzések
Az előző példa megköveteli a összehasonlítása searchValue
searchArray
a . Ennek a képességnek a garantálása érdekében a típusparamétert T
korlátozza az IComparable<T> interfész implementálásához. A kód az operátor helyett a CompareTo=
metódust használja, mivel nincs garancia arra, hogy a megadott T
típusargumentum támogatja az operátort =
.
Az eljárást az findElement
alábbi kóddal tesztelheti.
Public Sub tryFindElement()
Dim stringArray() As String = {"abc", "def", "xyz"}
Dim stringSearch As String = "abc"
Dim integerArray() As Integer = {7, 8, 9}
Dim integerSearch As Integer = 8
Dim dateArray() As Date = {#4/17/1969#, #9/20/1998#, #5/31/2004#}
Dim dateSearch As Date = Microsoft.VisualBasic.DateAndTime.Today
MsgBox(CStr(findElement(Of String)(stringArray, stringSearch)))
MsgBox(CStr(findElement(Of Integer)(integerArray, integerSearch)))
MsgBox(CStr(findElement(Of Date)(dateArray, dateSearch)))
End Sub
Az előző hívások a MsgBox
"0", az "1" és a "-1" megjelenítését kérik.