Delegaty (Visual Basic)
Obiekty delegowane są obiekty, które odwołują się do metody.Czasami są one opisane jako wskaźników funkcji bezpiecznego typu , ponieważ są one podobne do wskaźników funkcji używanych w innych językach programowania.Jednak w przeciwieństwie do wskaźników funkcji Visual Basic delegatów jest typem odwołania, oparty na klasie Delegate.Pełnomocnicy można odwoływać się obie metody udostępnionego — metody, które mogą być wywołane bez konkretnego wystąpienia klasy — i metody instancji.
Delegatów i wydarzenia
Obiekty delegowane są przydatne w sytuacjach, gdy konieczne jest pośrednikiem pomiędzy wywołanie procedury i wywoływanej procedury.Na przykład może być obiekt, który informuje o zdarzeniach, aby móc wywoływać programy obsługi zdarzeń różne w różnych okolicznościach.Niestety obiektu, podnoszenie, zdarzenia nie wie z wyprzedzeniem, którego program obsługi zdarzeń jest obsługa określonego zdarzenia.Visual Basicumożliwia obsługę zdarzeń dynamicznie stowarzyszonych ze zdarzeniami przez tworzenie na pełnomocnika, korzystając z AddHandler instrukcji.W czasie wykonywania pełnomocnik przesyła dalej wywołań obsługi zdarzeń właściwe.
Chociaż można tworzyć własne delegatów, w większości przypadków Visual Basic tworzy delegata i zajmuje się szczegóły dla Ciebie.Na przykład Event instrukcji niejawnie definiuje klasę obiektu delegowanego, o nazwie <EventName>EventHandler jako zagnieżdżony klasy zawierających klasy Event instrukcji i z samych sygnaturach zdarzenia.AddressOf Instrukcji niejawnie tworzy wystąpienie obiektu delegowanego, który odnosi się do szczególnej procedury.Następujące dwa wiersze kodu są równoważne.W pierwszym wierszu są Zobacz jawne utworzenie wystąpienia Eventhandler, z odniesieniem do metody Button1_Click wysyłane jako argumentu.Drugi wiersz jest bardziej wygodnym sposobem zrobić to samo.
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
Można użyć składni skróconej sposób tworzenia kompilator delegatów w dowolnym miejscu można określić typ delegata w kontekście.
Deklarowanie zdarzenia, które użyć istniejącego typu obiektu delegowanego
W niektórych sytuacjach można zadeklarować zdarzenie, aby użyć istniejącego typu obiektu delegowanego jako jego podstawowego obiektu delegowanego.Następującej składni demonstruje, jak:
Delegate Sub DelegateType()
Event AnEvent As DelegateType
Jest to przydatne, gdy chcesz rozesłać wiele zdarzeń do tej samej procedury obsługi.
Pełnomocnik zmiennych i parametrów
Można używać delegatów na inne, niepowiązane ze zdarzeniami związanych zadań, takich jak wolnych wątków lub procedurami, które trzeba wywoływać różne wersje funkcji w czasie wykonywania.
Załóżmy na przykład, aplikacja ad sklasyfikowane, która zawiera pole listy z nazwami samochodów.Reklamy są sortowane według tytułu, który jest zwykle marki samochodu.Problem, który mogą napotykać występuje, gdy niektóre samochody obejmują rok przed marka samochodu.Problemem jest to, że funkcje wbudowane sortowania pola listy sortuje tylko przez kody znaków; umieszcza wszystkie reklamy, począwszy od daty najpierw, następuje reklamy, począwszy od make.
Aby rozwiązać ten problem, można utworzyć procedurę sortowania w klasie, która używa standardowego sortowanie alfabetyczne w większości pól list, ale jest możliwość przełączania się w czasie wykonywania procedury sortowanie niestandardowe dla samochodów reklam.Aby to zrobić, można przekazać procedury sortowanie niestandardowe klasy sortowania w czasie wykonywania, za pomocą delegatów.
AddressOf i wyrażenia Lambda
Każda klasa obiektu delegowanego definiuje konstruktora, który jest przekazywany specyfikacji metody obiektu.Argument do konstruktora obiektu delegowanego musi być odwołaniem do metody lub wyrażenie lambda.
Aby określić odniesienie do metody, należy użyć następującej składni:
AddressOf [expression.]methodName
Typ kompilacji, expression musi być nazwą klasy lub interfejs, który zawiera metodę o określonej nazwie, w których podpis nie pasuje do podpisu klasy obiektu delegowanego.methodName Może być udostępniony metoda lub metody instancji.methodName Nie jest opcjonalny, nawet jeśli utworzyć obiektu delegowanego dla domyślnej metody klasy.
Aby określić wyrażenie lambda, należy użyć następującej składni:
Function(parm As type, parm2 As type2, ...])expression
W poniższym przykładzie pokazano zarówno AddressOf i wyrażenia lambda służy do określania odniesienia dla pełnomocnika.
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
Podpis funkcji musi być zgodny z typem obiektu delegowanego.Aby uzyskać więcej informacji na temat wyrażeń lambda, zobacz Lambda — Wyrażenia (Visual Basic).Aby uzyskać więcej przykładów wyrażenie lambda i AddressOf Zobacz przydziały do pełnomocników, Swobodna konwersja delegatów (Visual Basic).
Tematy pokrewne
Tytuł |
Opis |
---|---|
Zawiera przykład pokazuje, jak skojarzyć metodę z pełnomocnika, a następnie wywołania metody poprzez pełnomocnika. |
|
Porady: przekazywanie procedur do innej procedury w Visual Basic |
Demonstruje, jak używać delegatów do przekazywania jedną procedurę do innej procedury. |
W tym artykule opisano, jak można przypisać Podprocedura i funkcje delegatów lub obsługi nawet w przypadku, gdy ich podpisy nie są identyczne |
|
Omówienie zdarzeń w języku Visual Basic. |