デリゲート (プログラミング)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/02/16 13:57 UTC 版)
その他の言語のデリゲート
D言語には関数オブジェクトがあり、型としてfunctionとdelegateがある。無名関数を作る式として関数リテラルがあり、functionとdelegateのそれぞれに対応した構文がある。関数リテラルの省略構文としてラムダ式がある。functionとdelegateの違いは、作られたスコープの環境にアクセスできるかどうかで、アクセスする場合はデリゲートである必要がある。ラムダ式では内容に応じて、デリゲートである必要がある場合はデリゲートになる。
Javaはバージョン8にてラムダ式とともにメソッド参照の機能を導入した。ただしマルチキャストデリゲートに相当する機能はない。
C++/CLIは.NETマネージ言語であり、.NETのデリゲートをサポートする。メソッド宣言にdelegate
キーワードを使用することで、System::MulticastDelegate
を継承した、Invoke
という名前のメソッドを持つクラスが自動定義される点などは、C#とほぼ同じである[12]。ただし、C++11で追加されたラムダ式を使ってデリゲートのインスタンスを生成することはできず、gcnew
を使って明示的にデリゲートのインスタンスを生成する必要があるため、C# 2.0以降と比較してコードが煩雑になる[13]。
C++/CXは.NETマネージ言語ではなくネイティブ言語拡張だが、デリゲートをサポートする。イベントハンドラーの割り当てに利用される。ただし、C++/CXは参照カウントベースのガベージコレクションを採用していることから、強い参照による循環参照を防ぐため、イベントハンドラーの記述にはラムダ式よりも名前付き関数を利用することが推奨されている[14]。
Objective-Cは言語機能としてデリゲートを持たないが、Objective-Cを用いたイベント駆動型ソフトウェアを開発する際の基本的なデザインパターンとして「委譲」が採用されている[15]。実態はJavaのインターフェイスを利用したイベントコールバックと同じく、XxxDelegate
という名前を持つプロトコル(抽象型の一種)を採用(adopt)することでイベント処理のカスタマイズを実現する。Swiftのデリゲートも同様である。
注釈
- ^ DelphiもJ++もC#もアンダース・ヘルスバーグによる設計である。
- ^ Javaではまず
interface
構文によるインターフェイスやclass
構文によるスーパークラスの定義が必要であり、コード量が膨れ上がりやすい。サブクラス(インターフェイス実装クラス)の記述に関しては、無名クラスやラムダ式を利用することで簡略化できるが、コンパイラによって新たにサブクラス(インターフェイス実装クラス)が定義されることに変わりはない。
出典
- ^ デリゲート - C# プログラミング ガイド | Microsoft Docs
- ^ delegate - C# リファレンス | Microsoft Docs
- ^ Delegate Class (System) | Microsoft Learn
- ^ 方法 : デリゲートを結合する (マルチキャスト デリゲート) (C# プログラミング ガイド)
- ^ event (C# リファレンス)
- ^ 方法 : イベント サブスクリプションとサブスクリプションの解除 (C# プログラミング ガイド)
- ^ デリゲートを使用した非同期プログラミング
- ^ デリゲートに対する既定のマーシャリング
- ^ コールバック メソッドとしてのデリゲートのマーシャ リング | Microsoft Docs
- ^ 既定のマーシャリングの動作 | Microsoft Docs
- ^ C#からコールバック関数を使うCの関数を呼ぶ | sgryjp.log
- ^ delegate (C++/CLI and C++/CX) | Microsoft Learn
- ^ How to: Define and Use Delegates (C++/CLI) | Microsoft Learn
- ^ Delegates (C++/CX) | Microsoft Docs
- ^ Delegates and Data Sources | Apple Developer | Documentation Archive
- デリゲート (プログラミング)のページへのリンク