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 ttypu .

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í.

Viz také