Delegate — Instrukcja

Służy do deklarowania delegata. Delegat to typ odwołania, który odwołuje się do Shared metody typu lub metody wystąpienia obiektu. Każdą procedurę z pasującym parametrem i typami zwracanymi można użyć do utworzenia wystąpienia tej klasy delegata. Następnie można wywołać procedurę za pomocą wystąpienia delegata.

Składnia

[ <attrlist> ] [ accessmodifier ] _  
[ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([ parameterlist ])] [ As type ]  

generatora

Termin Definicja
attrlist Opcjonalny. Lista atrybutów, które mają zastosowanie do tego delegata. Wiele atrybutów jest rozdzielonych przecinkami. Należy ująć listę atrybutów w nawiasach kątowych ("<" i ">").
accessmodifier Opcjonalny. Określa, jaki kod może uzyskać dostęp do delegata. Może być jednym z następujących elementów:

- Publiczne. Dowolny kod, który może uzyskać dostęp do elementu, który deklaruje, że delegat może uzyskać do niego dostęp.
- Chronione. Dostęp do niego może uzyskać tylko kod w klasie delegata lub klasie pochodnej.
- Przyjaciel. Tylko kod w tym samym zestawie może uzyskać dostęp do delegata.
- Prywatne. Tylko kod w elemecie, który deklaruje, że delegat może uzyskać do niego dostęp.

- Chroniony przyjaciel tylko kod w klasie delegata, klasa pochodna lub ten sam zestaw może uzyskać dostęp do delegata.
- Prywatny kod chroniony tylko w klasie delegata lub w klasie pochodnej w tym samym zestawie może uzyskać dostęp do delegata.
Shadows Opcjonalny. Wskazuje, że ten delegat ponownie deklaruje i ukrywa identycznie nazwany element programowania lub zestaw przeciążonych elementów w klasie bazowej. Możesz cieniować dowolny rodzaj zadeklarowanego elementu z dowolnym innym rodzajem.

Element w tle jest niedostępny z klasy pochodnej, która go zaciemnia, z wyjątkiem tego, gdzie element cieniowania jest niedostępny. Jeśli na przykład Private element w tle element klasy bazowej, kod, który nie ma uprawnień dostępu do elementu, uzyskuje dostęp Private do elementu klasy bazowej.
Sub Opcjonalnie, ale musi pojawić się element Sub lub Function . Deklaruje tę procedurę jako procedurę delegata Sub , która nie zwraca wartości.
Function Opcjonalnie, ale musi pojawić się element Sub lub Function . Deklaruje tę procedurę jako procedurę delegata Function , która zwraca wartość.
name Wymagany. Nazwa typu delegata; jest zgodna ze standardową konwencją nazewnictwa zmiennych.
typeparamlist Opcjonalny. Lista parametrów typu dla tego delegata. Wiele parametrów typu jest rozdzielonych przecinkami. Opcjonalnie każdy parametr typu może być zadeklarowany jako wariant przy użyciu i InOut modyfikatorów ogólnych. Należy ująć listę typów w nawiasy i wprowadzić ją za pomocą słowa kluczowego Of .
parameterlist Opcjonalny. Lista parametrów przekazywanych do procedury, gdy jest wywoływana. Należy ująć listę parametrów w nawiasy.
type Wymagane, jeśli określisz procedurę Function . Typ danych zwracanej wartości.

Uwagi

Instrukcja Delegate definiuje parametr i zwracane typy klasy delegata. Każdą procedurę z pasującymi parametrami i typami zwracanymi można użyć do utworzenia wystąpienia tej klasy delegata. Następnie można wywołać procedurę za pomocą wystąpienia delegata, wywołując metodę delegata Invoke .

Delegaty można zadeklarować na poziomie przestrzeni nazw, modułu, klasy lub struktury, ale nie w ramach procedury.

Każda klasa delegata definiuje konstruktor, który jest przekazywany do specyfikacji metody obiektu. Argument konstruktora delegata musi być odwołaniem do metody lub wyrażenia lambda.

Aby określić odwołanie do metody, użyj następującej składni:

AddressOf [expression.]methodname

Typ expression czasu kompilacji musi być nazwą klasy lub interfejsu, który zawiera metodę określonej nazwy, której podpis jest zgodny z podpisem klasy delegata. Może methodname to być metoda współdzielona lub metoda wystąpienia. Element methodname nie jest opcjonalny, nawet jeśli utworzysz delegata dla domyślnej metody klasy.

Aby określić wyrażenie lambda, użyj następującej składni:

Function ([parm Jako type, parm2 jako type2, ...]) expression

Podpis funkcji musi być zgodny z typem delegata. Aby uzyskać więcej informacji na temat wyrażeń lambda, zobacz Wyrażenia lambda.

Aby uzyskać więcej informacji na temat delegatów, zobacz Delegaty.

Przykład

W poniższym przykładzie użyto instrukcji w Delegate celu zadeklarowania delegata do obsługi dwóch liczb i zwrócenia liczby. Metoda DelegateTest przyjmuje wystąpienie delegata tego typu i używa go do działania na parach liczb.

Delegate Function MathOperator( 
    ByVal x As Double, 
    ByVal y As Double 
) As Double

Function AddNumbers( 
    ByVal x As Double, 
    ByVal y As Double 
) As Double
    Return x + y
End Function

Function SubtractNumbers( 
    ByVal x As Double, 
    ByVal y As Double
) As Double
    Return x - y
End Function

Sub DelegateTest( 
    ByVal x As Double, 
    ByVal op As MathOperator, 
    ByVal y As Double 
)
    Dim ret As Double
    ret = op.Invoke(x, y) ' Call the method.
    MsgBox(ret)
End Sub

Protected Sub Test()
    DelegateTest(5, AddressOf AddNumbers, 3)
    DelegateTest(9, AddressOf SubtractNumbers, 3)
End Sub

Zobacz też