Sdílet prostřednictvím


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 alespoň jeden parametr typu, kromě jakýchkoli běžných parametrů, které může mít. 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

Můžete volat obecný postup, aniž byste zadávali jakékoli argumenty typu. 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í, při kterém kompilátor odvodí, že má předat typ String jako typový parametr t.

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 typový parametr T k implementaci rozhraní IComparable<T>. Kód používá metodu CompareTo místo operátoru =, protože neexistuje žádná záruka, že typ argumentu zadaného pro T podporuje operátor =.

Můžete otestovat postup 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í MsgBox zobrazují "0", "1" a "-1" v uvedeném pořadí.

Viz také