Meghatalmazottak (Visual Basic)
A meghatalmazottak metódusokra hivatkozó objektumok. Ezeket néha típusbiztos függvénymutatóknak is nevezik, mert hasonlóak a más programozási nyelvekben használt függvénymutatókhoz. A függvénymutatókkal ellentétben azonban Visual Basic delegáltak az osztályon System.Delegatealapuló referenciatípusok. A meghatalmazottak hivatkozhatnak a megosztott metódusokra – az osztály egy adott példánya nélkül meghívható metódusokra – és a példánymetórán is.
Meghatalmazottak és események
A meghatalmazottak olyan helyzetekben hasznosak, amikor közvetítőre van szükség a hívási eljárás és a meghívott eljárás között. Előfordulhat például, hogy olyan objektumot szeretne, amely eseményeket hoz létre, hogy különböző körülmények között különböző eseménykezelőket hívhasson meg. Sajnos az eseményeket növelő objektum nem tudja előre, hogy melyik eseménykezelő kezeli az adott eseményt. Visual Basic lehetővé teszi, hogy az eseménykezelőket dinamikusan társítsa az eseményekhez egy delegált létrehozásával az AddHandler
utasítás használatakor. Futásidőben a meghatalmazott továbbítja a hívásokat a megfelelő eseménykezelőnek.
Bár létrehozhat saját meghatalmazottakat, a legtöbb esetben Visual Basic létrehozza a meghatalmazottat, és gondoskodik a részletekről. Egy utasítás például Event
implicit módon definiálja az utasítást tartalmazó Event
osztály beágyazott osztályaként elnevezett <EventName>EventHandler
delegált osztályt, és ugyanazzal az aláírással, mint az esemény. Az AddressOf
utasítás implicit módon létrehoz egy delegált egy példányát, amely egy adott eljárásra hivatkozik. Az alábbi két kódsor egyenértékű. Az első sorban egy példány EventHandler
explicit létrehozása látható, az argumentumként küldött metódusra Button1_Click
mutató hivatkozással. A második sor kényelmesebb módja annak, hogy ugyanezt tegye.
AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)
' The following line of code is shorthand for the previous line.
AddHandler Button1.Click, AddressOf Me.Button1_Click
A meghatalmazottak létrehozásának rövid módszerét használhatja bárhol, ahol a fordító meghatározhatja a delegált típusát a környezet alapján.
Meglévő meghatalmazotttípust használó események deklarálása
Bizonyos esetekben érdemes lehet deklarálni egy eseményt, hogy egy meglévő delegálttípust használjon mögöttes delegáltként. Az alábbi szintaxis bemutatja, hogyan:
Delegate Sub DelegateType()
Event AnEvent As DelegateType
Ez akkor hasznos, ha több eseményt szeretne ugyanarra a kezelőre irányítani.
Változók és paraméterek delegálása
Delegáltakat használhat más, nem eseményekkel kapcsolatos feladatokhoz, például ingyenes szálkezeléshez, vagy olyan eljárásokhoz, amelyeknek futásidőben különböző függvényverziókat kell meghívnia.
Tegyük fel például, hogy van egy besorolt hirdetésalkalmazása, amely tartalmaz egy listamezőt az autók nevével. A hirdetések cím szerint vannak rendezve, ami általában az autóé. A probléma akkor fordulhat elő, ha néhány autó tartalmazza az év az autó, mielőtt a make. A probléma az, hogy a lista beépített rendezési funkciója csak karakterkódok szerint rendezi a listát; az összes hirdetést dátumokkal kezdődően helyezi el először, majd a hirdetéseket a make-vel kezdődően.
Ennek kijavításához létrehozhat egy rendezési eljárást egy olyan osztályban, amely a legtöbb listamezőben a szabványos betűrendet használja, de futásidőben átválthat az autóhirdetések egyéni rendezési eljárására. Ehhez az egyéni rendezési eljárást futtatáskor átadja a rendezési osztálynak meghatalmazottak használatával.
AddressOf és Lambda kifejezések
Minden delegált osztály definiál egy konstruktort, amely megfelel egy objektummetódus specifikációjának. A delegált konstruktor argumentumának metódusra vagy lambda kifejezésre való hivatkozásnak kell lennie.
Metódusra mutató hivatkozás megadásához használja az alábbi szintaxist:
AddressOf
[expression
.]methodName
A fordítási idő típusának expression
egy osztálynak vagy interfésznek kell lennie, amely a megadott név olyan metódusát tartalmazza, amelynek aláírása megegyezik a delegált osztály aláírásával. Ez methodName
lehet megosztott vagy példánymetódus. Ez methodName
nem kötelező, még akkor sem, ha létrehoz egy delegáltat az osztály alapértelmezett metódusához.
Lambda-kifejezés megadásához használja az alábbi szintaxist:
Function
([parm
As type
, parm2
As type2
, ...]) expression
Az alábbi példa a meghatalmazott hivatkozásának megadására használt lambda kifejezéseket is AddressOf
bemutatja.
Module Module1
Sub Main()
' Create an instance of InOrderClass and assign values to the properties.
' InOrderClass method ShowInOrder displays the numbers in ascending
' or descending order, depending on the comparison method you specify.
Dim inOrder As New InOrderClass
inOrder.Num1 = 5
inOrder.Num2 = 4
' Use AddressOf to send a reference to the comparison function you want
' to use.
inOrder.ShowInOrder(AddressOf GreaterThan)
inOrder.ShowInOrder(AddressOf LessThan)
' Use lambda expressions to do the same thing.
inOrder.ShowInOrder(Function(m, n) m > n)
inOrder.ShowInOrder(Function(m, n) m < n)
End Sub
Function GreaterThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
Return num1 > num2
End Function
Function LessThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
Return num1 < num2
End Function
Class InOrderClass
' Define the delegate function for the comparisons.
Delegate Function CompareNumbers(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
' Display properties in ascending or descending order.
Sub ShowInOrder(ByVal compare As CompareNumbers)
If compare(_num1, _num2) Then
Console.WriteLine(_num1 & " " & _num2)
Else
Console.WriteLine(_num2 & " " & _num1)
End If
End Sub
Private _num1 As Integer
Property Num1() As Integer
Get
Return _num1
End Get
Set(ByVal value As Integer)
_num1 = value
End Set
End Property
Private _num2 As Integer
Property Num2() As Integer
Get
Return _num2
End Get
Set(ByVal value As Integer)
_num2 = value
End Set
End Property
End Class
End Module
A függvény aláírásának meg kell egyeznie a delegált típuséval. További információ a lambda kifejezésekről: Lambda Expressions. További példák a lambda kifejezésre és AddressOf
a meghatalmazottakhoz való hozzárendelésekre: Nyugodt delegálás.
Kapcsolódó témakörök
Cím | Leírás |
---|---|
Útmutató: Delegált metódus meghívása | Egy példát mutat be, amely bemutatja, hogyan társíthat egy metódust egy meghatalmazotthoz, majd hogyan hívhatja meg ezt a metódust a meghatalmazotton keresztül. |
Útmutató: Eljárások átadása másik eljárásnak a Visual Basic | Bemutatja, hogyan adhat át egy eljárást egy másik eljárásnak meghatalmazottak használatával. |
Delegáltkonvertálási ellaz | Azt ismerteti, hogyan rendelhet al- és függvényeket delegáltakhoz vagy kezelőkhöz akkor is, ha az aláírásuk nem azonos |
Események | Áttekintést nyújt a Visual Basic eseményeiről. |