goo blog サービス終了のお知らせ 

中年サラリーマンのC#プログラミング勉強日記

プログラミング超初心者(おっさん)のC#勉強日記です。同じ境遇でがんばっている人がいたらコメントもらえるとうれしいです。

デリゲートを勉強してみる。

2014-04-06 22:21:09 | 日記
今回はデリゲートを勉強しようと思う。
本当は、前回出てきたイベントハンドラを勉強しようと思ったんだけど、いろいろみていたら先にデリゲートを理解しないと厳しいようだ。

参考にしたのはこちら。この人の記事は他のトピックもとても参考になりそう。

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;


続けて、コンストラクタで今定義したデリゲートをインスタンス化
public Form1()
{
InitializeComponent();
Res1 = new OyajiResponses(FirstReact);//冷たい反応を返すデリゲート
Res2 = new OyajiResponses(MiracleReact); //温かい反応を返すデリゲート
oyajiRes += Res1; //最初は冷たい反応を返すデリゲートを格納
}


実際に実行するメソッドを実装
static void FirstReact()
{
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;
}


■実行してみる。
まずは「飲みに誘う」をクリックしても冷たい反応

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


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

無事成功!
なんか寂しい気分。。。


最新の画像もっと見る

コメントを投稿

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。