Udostępnij za pośrednictwem


__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