__delegate

 

発行: 2016年4月

メモ   このトピックは、C++ マネージ拡張のバージョン 1 にのみ対応しています。 この構文は、バージョン 1 のコードを保守するためだけに使用してください。 参照してください delegate (C++ コンポーネント拡張) については、新しい構文で同等の機能を使用します。

メソッドを特定のシグネチャでカプセル化するために使用できる参照型を定義します。

構文

__delegate 
function-declarator

解説

デリゲートは、次の相違点を除けば、C++ の関数ポインターとほぼ同じです。

  • デリゲートをバインドできるのは __gc クラス内の 1 つ以上のメソッドのみです。

コンパイラが __delegate キーワードを検出すると、__gc クラスの定義が生成されます。 この __gc クラスには、次の特性があります。

  • System::MulticastDelegate から継承します。

  • コンストラクターは、__gc クラスまたは NULL へのポインター (静的メソッドへのバインドの場合) と指定した型の完全修飾メソッドの 2 つの引数を受け取ります。

  • Invoke というメソッドを持ち、そのシグネチャはデリゲートの宣言されたシグネチャと一致します。

使用例

次の例では、__gc クラス (MyCalendar) およびデリゲート (GetDayOfWeek) が宣言されています。 次に、デリゲートは MyCalendar のさまざまなメソッドにバインドされ、各メソッドを順に呼び出します。

// 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)));
}

出力例

static handler
6
static handler
handler
4