今回はデリゲートを勉強しようと思う。
本当は、前回出てきたイベントハンドラを勉強しようと思ったんだけど、いろいろみていたら先にデリゲートを理解しないと厳しいようだ。
参考にしたのはこちら。この人の記事は他のトピックもとても参考になりそう。
C# によるプログラミング入門
http://ufcpp.net/study/csharp/sp_delegate.html
解説をみると「デリゲートは関数ポインターや関数オブジェクトのオブジェクト指向版(??)」みたいな事が書いてある。今の僕の実力では理解不能。。。
いろいろ調べてみて、一応下記のように理解した。
図1:デリゲートにメソッド1を代入

図2:デリゲートにメソッド2を代入

同じデリゲートAを実行してるのに、反応を変えることができるわけだ。
つまりこういうことか?
図3 誘ってみる、、、冷たい反応

デリゲートの中身を入れ替えると。
図4 誘ってみる、、、奇跡の反応

そういうことだったのか。
いまいち、デリゲートの実開発での使い方がわからないので、この図3、図4を作ってみる。
といっても初心者なのでこんな感じ。
■画面

1.最初、飲みに誘っても(ボタン①を押す)冷たいリアクション

2.魔法のボタン(②)を押したあと、もう一度誘うと温かい反応が返ってくるというもの。

このための登場人物は
1) OyajiResponses:今回利用するvoid型のdelegate
2) oyajiRes:実際に実行するデリゲート
3) Res1: oyajiResに格納するデリゲート(冷たい反応)
4) Res2: oyajiResに格納するデリゲート(温かい反応)
5) FirstReact(): Res1が指す(実行する)メソッド(理屈は勉強不足だけどstaticでないといけないみたい。。。)
6) MiracleReact(): Res2が指す(実行する)メソッド
7) OsasoiButton: oyajiRes デリゲートを実行するボタン
8) MiracleButton: oyajiResの中身を、Res1からRes2に変更するボタン
こんな感じでコーディング開始
①まずは、各デリゲートを定義
続けて、コンストラクタで今定義したデリゲートをインスタンス化
実際に実行するメソッドを実装
本当は、前回出てきたイベントハンドラを勉強しようと思ったんだけど、いろいろみていたら先にデリゲートを理解しないと厳しいようだ。
参考にしたのはこちら。この人の記事は他のトピックもとても参考になりそう。
C# によるプログラミング入門
http://ufcpp.net/study/csharp/sp_delegate.html
解説をみると「デリゲートは関数ポインターや関数オブジェクトのオブジェクト指向版(??)」みたいな事が書いてある。今の僕の実力では理解不能。。。
いろいろ調べてみて、一応下記のように理解した。
図1:デリゲートにメソッド1を代入

図2:デリゲートにメソッド2を代入

同じデリゲートAを実行してるのに、反応を変えることができるわけだ。
つまりこういうことか?
図3 誘ってみる、、、冷たい反応

デリゲートの中身を入れ替えると。
図4 誘ってみる、、、奇跡の反応

そういうことだったのか。
いまいち、デリゲートの実開発での使い方がわからないので、この図3、図4を作ってみる。
といっても初心者なのでこんな感じ。
■画面

1.最初、飲みに誘っても(ボタン①を押す)冷たいリアクション

2.魔法のボタン(②)を押したあと、もう一度誘うと温かい反応が返ってくるというもの。

このための登場人物は
1) OyajiResponses:今回利用するvoid型のdelegate
2) oyajiRes:実際に実行するデリゲート
3) Res1: oyajiResに格納するデリゲート(冷たい反応)
4) Res2: oyajiResに格納するデリゲート(温かい反応)
5) FirstReact(): Res1が指す(実行する)メソッド(理屈は勉強不足だけどstaticでないといけないみたい。。。)
6) MiracleReact(): Res2が指す(実行する)メソッド
7) OsasoiButton: oyajiRes デリゲートを実行するボタン
8) MiracleButton: oyajiResの中身を、Res1からRes2に変更するボタン
こんな感じでコーディング開始
①まずは、各デリゲートを定義
public partial class Form1 : Form
{
{
delegate void OyajiResponses();
OyajiResponses oyajiRes;
OyajiResponses Res1;
OyajiResponses Res2;
OyajiResponses oyajiRes;
OyajiResponses Res1;
OyajiResponses Res2;
続けて、コンストラクタで今定義したデリゲートをインスタンス化
public Form1()
{
{
InitializeComponent();
Res1 = new OyajiResponses(FirstReact);//冷たい反応を返すデリゲート
Res2 = new OyajiResponses(MiracleReact); //温かい反応を返すデリゲート
oyajiRes += Res1; //最初は冷たい反応を返すデリゲートを格納
}Res1 = new OyajiResponses(FirstReact);//冷たい反応を返すデリゲート
Res2 = new OyajiResponses(MiracleReact); //温かい反応を返すデリゲート
oyajiRes += Res1; //最初は冷たい反応を返すデリゲートを格納
実際に実行するメソッドを実装
static void FirstReact()
{
static void MiracleReact()
{
{
MessageBox.Show("・・・"); //冷たい反応
}static void MiracleReact()
{
MessageBox.Show("うれしい!"); //温かい反応
}最後にボタンを押したときの反応を記述
ボタン①を押したときはoyajiResデリゲートを実行
private void OsasoiButton_Click(object sender, EventArgs e)
{
{
oyajiRes();
}ボタン②を押すと、ボタン①で実行されるデリゲートの中身が変わる。
private void MiracleButton_Click(object sender, EventArgs e)
{
{
oyajiRes += Res2;
oyajiRes -= Res1;
}oyajiRes -= Res1;
■実行してみる。
まずは「飲みに誘う」をクリックしても冷たい反応

次に「魔法のボタン」をクリック

同じ、「飲みに誘う」を押すと今度は違う反応。

無事成功!
なんか寂しい気分。。。
※コメント投稿者のブログIDはブログ作成者のみに通知されます