Obecné procedury v jazyce Visual Basic
Obecný postup, označovaný také jako obecná metoda, je procedura definovaná alespoň s jedním parametrem typu. Volající kód tak může přizpůsobit datové typy svým požadavkům pokaždé, když volá proceduru.
Procedura není obecná jednoduše z důvodu definování uvnitř obecné třídy nebo obecné struktury. Aby byl postup obecný, musí mít kromě všech normálních parametrů, které může trvat, alespoň jeden parametr typu. Obecná třída nebo struktura může obsahovat negenerické procedury a negenerická třída, struktura nebo modul mohou obsahovat obecné procedury.
Obecný postup může použít parametry typu v seznamu normálních parametrů, v jeho návratovém typu, pokud má jeden, a v kódu procedury.
Odvození typu
Obecný postup můžete volat bez zadání argumentů typu vůbec. Pokud ho zavoláte tímto způsobem, kompilátor se pokusí určit odpovídající datové typy, které se mají předat argumentům typu procedury. Tomu se říká odvození typu. Následující kód ukazuje volání, ve kterém kompilátor odvodí, že by měl předat typ String
parametru t
typu .
Public Sub testSub(Of t)(ByVal arg As t)
End Sub
Public Sub callTestSub()
testSub("Use this string")
End Sub
Pokud kompilátor nemůže odvodit argumenty typu z kontextu volání, oznámí chybu. Jednou z možných příčin takové chyby je neshoda pořadí polí. Předpokládejme například, že definujete normální parametr jako pole parametru typu. Pokud zavoláte obecný postup poskytující pole jiného pořadí (počet dimenzí), neshoda způsobí selhání odvozování typu. Následující kód ukazuje volání, ve kterém je dvojrozměrné pole předáno procedurě, která očekává jednorozměrné pole.
Public Sub demoSub(Of t)(ByVal arg() As t)
End Sub
Public Sub callDemoSub()
Dim twoDimensions(,) As Integer
demoSub(twoDimensions)
End Sub
Odvození typu můžete vyvolat pouze tak, že vynecháte všechny argumenty typu. Pokud zadáte jeden argument typu, musíte je zadat všechny.
Odvození typu je podporováno pouze pro obecné postupy. Nelze vyvolat odvození typu u obecných tříd, struktur, rozhraní nebo delegátů.
Příklad
Popis
Následující příklad definuje obecný Function
postup pro vyhledání konkrétního prvku v poli. Definuje jeden parametr typu a používá ho k vytvoření dvou parametrů v seznamu parametrů.
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
Komentáře
Předchozí příklad vyžaduje schopnost porovnat searchValue
s každým prvkem .searchArray
Chcete-li zaručit tuto schopnost, omezuje parametr T
typu na implementaci IComparable<T> rozhraní. Kód používá metodu CompareTo místo operátoru =
, protože neexistuje žádná záruka, že typ zadaný argument pro T
podporu operátoru =
.
Postup můžete otestovat findElement
pomocí následujícího kódu.
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
Předchozí volání pro MsgBox
zobrazení "0", "1" a "-1" v uvedeném pořadí.