Megosztás a következőn keresztül:


Variancia használata Func és Action típusú generikus delegáltakhoz (Visual Basic)

Ezek a példák bemutatják, hogyan használhatja a kovarianciát és a kontravarianciát az Func és Action általános delegátumokban a metódusok újrafelhasználásának engedélyezéséhez és a kód rugalmasságának biztosításához.

A kovarianciáról és az ellenvarianciáról további információt a Meghatalmazottak varianciája (Visual Basic) című témakörben talál.

Delegáltak használata kovariáns típusparaméterekkel

Az alábbi példa a kovariáns támogatás előnyeit mutatja be az általános Func delegátumokban. A FindByTitle metódus a típus paraméterét String veszi fel, és visszaadja a Employee típus egy objektumát. Ezt a metódust azonban hozzárendelheti a Func(Of String, Person) meghatalmazotthoz, mert Employee örökli Person.

' Simple hierarchy of classes.
Public Class Person
End Class

Public Class Employee
    Inherits Person
End Class

Class Finder
    Public Shared Function FindByTitle(
        ByVal title As String) As Employee
        ' This is a stub for a method that returns
        ' an employee that has the specified title.
        Return New Employee
    End Function

    Sub Test()
        ' Create an instance of the delegate without using variance.
        Dim findEmployee As Func(Of String, Employee) =
            AddressOf FindByTitle

        ' The delegate expects a method to return Person,
        ' but you can assign it a method that returns Employee.
        Dim findPerson As Func(Of String, Person) =
            AddressOf FindByTitle

        ' You can also assign a delegate
        ' that returns a more derived type to a delegate
        ' that returns a less derived type.
        findPerson = findEmployee
    End Sub
End Class

Meghatalmazottak használata contravariáns típusú paraméterekkel

Az alábbi példa a contravariance támogatás előnyeit mutatja be az Action általános delegáltakban. A AddToContacts metódus egy ilyen típusú paramétert Person használ. Ezt a metódust azonban hozzárendelheti a Action(Of Employee) meghatalmazotthoz, mert Employee örökli Person.

Public Class Person
End Class

Public Class Employee
    Inherits Person
End Class

Class AddressBook
    Shared Sub AddToContacts(ByVal person As Person)
        ' This method adds a Person object
        ' to a contact list.
    End Sub

    Sub Test()
        ' Create an instance of the delegate without using variance.
        Dim addPersonToContacts As Action(Of Person) =
            AddressOf AddToContacts

        ' The Action delegate expects
        ' a method that has an Employee parameter,
        ' but you can assign it a method that has a Person parameter
        ' because Employee derives from Person.
        Dim addEmployeeToContacts As Action(Of Employee) =
            AddressOf AddToContacts

        ' You can also assign a delegate
        ' that accepts a less derived parameter
        ' to a delegate that accepts a more derived parameter.
        addEmployeeToContacts = addPersonToContacts
    End Sub
End Class

Lásd még