__delegate
Uwaga w tym temacie dotyczą tylko wersji 1 rozszerzenia zarządzane dla języka C++. Tej składni tylko powinien być używany do obsługi kodu w wersji 1. Zobacz Delegat (C++ Component Extensions) informacji dotyczących używania równoważne funkcje w nowej składni.
Definiuje typ odwołania, który może służyć do hermetyzacji metody o określonej sygnatury.
Składnia
__delegate
function-declarator
Uwagi
Delegat jest grubsza odpowiada wskaźnik funkcji języka C++, z wyjątkiem następujących różnic:
- Delegat może być powiązany tylko z jedną lub więcej metod w klasie __gc —.
Gdy kompilator napotka __delegate definicji klasy __gc — słowo kluczowe jest generowany. Ta klasa __gc — ma następującą charakterystykę:
Dziedziczy z System::MulticastDelegate.
Ma on Konstruktor, który przyjmuje dwa argumenty: wskaźnik do klasy __gc — lub NULL (w przypadku powiązania metody statycznej) i w pełni kwalifikowaną metoda określonego typu.
Ma metodę o nazwie Invoke, którego podpis pasuje do podpisu zadeklarowane delegata.
Przykład
W poniższym przykładzie klasa __gc — (MyCalendar) i delegata (GetDayOfWeek) są zadeklarowane. Delegat jest następnie związana z różnych metod MyCalendar, z kolei każdego wywołania:
// keyword__delegate.cpp
// compile with: /clr:oldSyntax
#using <mscorlib.dll>
using namespace System;
__delegate int GetDayOfWeek();
__gc class MyCalendar {
public:
MyCalendar() : m_nDayOfWeek(4) {}
int MyGetDayOfWeek() {
Console::WriteLine("handler"); return m_nDayOfWeek;
}
static int MyStaticGetDayOfWeek() {
Console::WriteLine("static handler");
return 6;
}
private:
int m_nDayOfWeek;
};
int main () {
GetDayOfWeek * pGetDayOfWeek; // declare delegate type
int nDayOfWeek;
// bind delegate to static method
pGetDayOfWeek = new GetDayOfWeek(0, &MyCalendar::MyStaticGetDayOfWeek);
nDayOfWeek = pGetDayOfWeek->Invoke();
Console::WriteLine(nDayOfWeek);
// bind delegate to instance method
MyCalendar * pcal = new MyCalendar();
pGetDayOfWeek = static_cast<GetDayOfWeek*>(Delegate::Combine(pGetDayOfWeek,
new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));
nDayOfWeek = pGetDayOfWeek->Invoke();
Console::WriteLine(nDayOfWeek);
// delegate now bound to two methods; remove instance method
pGetDayOfWeek = static_cast<GetDayOfWeek*>(Delegate::Remove(pGetDayOfWeek,
new GetDayOfWeek(pcal, &MyCalendar::MyGetDayOfWeek)));
}
Przykładowe dane wyjściowe
static handler
6
static handler
handler
4