この知恵ノートを「知恵コレクション」に追加しました。
追加した知恵ノートはMy知恵袋の「知恵コレクション」ページで確認できます。
「知恵コレクション」に登録済みです。
再登録しました。
追加に失敗しました。
ノートに戻り、もう一度やり直してください。
すでに1,000件のノートが登録されています。
新しく追加したい場合は、My知恵袋の「知恵コレクション」ページで登録されているノートを削除してください。
追加できませんでした。
ノートは削除されました。
知恵コレに追加する:0人
C# ポリモーフィズム No.1 デリゲート <複数のメソッドを変数のように切り替える>
ライター:abiko_tetuさん(最終更新日時:2012/11/5)投稿日:2012/1/29 アドバイス受付中!
- ナイス!:
15
- 閲覧数:2037
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
C# ポリモーフィズム No.1 デリゲート
--- 複数のメソッドを変数のように切り替える
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
「C#で ポリモーフィズム」における一連の説明(知恵ノート)において、ここでは、「デリゲート <複数のメソッドを変数のように切り替える>」について説明します。
総合の目次
本ページを含めた関連事項の総合目次です。
http://note.chiebukuro.yahoo.co.jp/detail/n54379
はじめに
変数は、値が異なる個々のケースに対応が可能になるので、便利であることは、プログラマーなら誰でもよく知っている事だと思います。
同じように、動作定義も個々のケースに応じて切り替えられたら便利です。
それはデリゲートと言う機能で実現が可能です。
すなわち、複数のメソッドを用意しておいて、デリゲートと言う機能で切り替えていくことが可能です。
他の関連サンプルと比べた特徴
本サンプルでは、複数のメソッドを用意しておいて、それらの中から、状況に合ったメソッドに切り替えます。
すなわち、メソッドの内容を、まるで変数のように切り替えます。
同じように、複数のクラスを切り替える手法もあります。
そのクラス単位で切り替える方法は、別の機会(関連サンプル)で紹介します。
ここでは、メソッド単位で切り替える手法について解説します。
サンプルコード
ここで取り上げるサンプルは、なるべく複雑にならない範囲で、実際にデリゲートを確かめられるものとします。
本サンプの仕様
本サンプルでは、デリゲートの基本的なコードの書き方を紹介することが目的なので、単純な計算を行なうだけにしました。
具体的には、足し算、引き算、掛け算、割り算の各種計算用メソッドを、デリゲートで切り替えるようにしています。
操作の手順としては、テキストボックス1に演算値1(例えば7+12ならば、その7)を入力する。
テキストボックス2に演算値2(例えば7+12ならば、その12)を入力する。
加算、減算、乗算、除算の選択を4個のラジオボタンから選択する。
これらの入力と選択を終えたら、ボタンをクリックします。
そうすると、計算結果がラベルに表示されます。
フォームデザイン等の前準備
コードを記述する前に、フォームのデザイン作成などの、以下の前準備を行なって下さい。
<プロジェクトの作成>
本サンプルの確認用に、新規にプロジェクトを作成して下さい。
プロジェクトの種類は、「Windowsフォームアプリケーション」です。
<フォームのデザイン>
デザイン画面で、TextBox (テキストボックス) を2個と、RadioButton(ラジオボタン) を4個と、Label(ラベル) を1個と、 Button (ボタン)を1個貼り付けて下さい。
なお、GroupBox(グループボックス)を貼り付けて、その上に各ラジオボタンを貼り付けても構いません(ラジオボタンの群は、ひとグループだけなので、グループボックスは、有っても無くても構いません)。
<イベントプロシージャの作成>
デザイン画面のフォーム(無地の部分)をダブルクリックして、Form1_Load() メソッド を作って下さい。
また、先程貼り付けたデザイン画面上のボタン「button1」をダブルクリックして、button1_Click() メソッド を作って下さい。
<クラスを書くためのソースファイルの作成>
[プロジェクト] - [クラスの追加] で、「新しい項目の追加」画面を表示する。
その画面の [ファイル名]欄に任意のファイル名(クラス用ソースファイルのファイル名)を記入する。
[追加]ボタンをクリックする。
なお、ここで作成されたソースファイルには、後述しますクラスのコード(「演算処理クラスのコード)を記述します。
演算処理クラスのコード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DelegateSample
{
// ************************************************
// 演算処理クラス
// 各種演算メソッドと、そのデリゲートをまとめたクラス
// ************************************************
class ArithmeticClass
{
//------------------------
// 加算メソッド
public static float AddMethod(float x, float y)
{
return x + y;
}
//------------------------
// 減算メソッド
public static float SubtracMethod(float x, float y)
{
return x - y;
}
//------------------------
// 乗算メソッド
public static float MultiplyMethod(float x, float y)
{
return x * y;
}
//------------------------
// 除算メソッド
public static float DivideMethod(float x, float y)
{
return x / y;
}
//------------------------
// 演算メソッド用デリゲート
public delegate float ArithmeticMethodDelegate(float x, float y);
}
}
Formクラスのコード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DelegateSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//============
// フォーム起動時のイベントプロシージャ
private void Form1_Load(object sender, EventArgs e)
{
//------------------------
// 各種コントロールの初期設定
//------------------------
button1.Text = "計算";
groupBox1.Text = "演算種別を選択";
radioButton1.Text = "加算";
radioButton2.Text = "減算";
radioButton3.Text = "乗算";
radioButton4.Text = "除算";
radioButton1.Checked = true; // ラジオボタン1 をON で初期化
textBox1.Text = "0.0";
textBox2.Text = "0.0";
label1.Text = "0.0";
}
//============
// 計算ボタン
private void button1_Click(object sender, EventArgs e)
{
//------------------------
// 演算値 文字列 ---> 数値 変換
//------------------------
float data1;
Single.TryParse(textBox1.Text, out data1);
float data2;
Single.TryParse(textBox2.Text, out data2);
//------------------------
// デリゲートを用いて演算種別を選択
//------------------------
ArithmeticClass.ArithmeticMethodDelegate ArithmeticDelegate;
// 加算選択時
if (radioButton1.Checked == true)
{
ArithmeticDelegate = new ArithmeticClass.ArithmeticMethodDelegate(ArithmeticClass.AddMethod);
}
// 減算選択時
else if (radioButton2.Checked == true)
{
ArithmeticDelegate = new ArithmeticClass.ArithmeticMethodDelegate(ArithmeticClass.SubtracMethod);
}
// 乗算選択時
else if (radioButton3.Checked == true)
{
ArithmeticDelegate = new ArithmeticClass.ArithmeticMethodDelegate(ArithmeticClass.MultiplyMethod);
}
// 除算選択時
else
{
ArithmeticDelegate = new ArithmeticClass.ArithmeticMethodDelegate(ArithmeticClass.DivideMethod);
}
//------------------------
// 演算処理実行
//------------------------
float ans = ArithmeticDelegate(data1, data2);
label1.Text = ans.ToString();
}
}
}
実行結果
計算結果が表示されます。
解説(コードを書くポイント)
まず、切り替えて行く各種メソッドを、どのような引数の並びによるメソッドにするのか、それを宣言します。
その宣言は、以下のようにします。
delegate 戻り値の型 デリゲート名(引数の型 引数1, 引数の型 引数2, ---);
前述のサンプルの場合は、以下のようになっています。
delegate float ArithmeticMethodDelegate(float x, float y);
次に、選択したメソッドをオブジェクトに収めます。
デリゲート名 オブジェクト名 = new デリゲート名(メソッド名);
前述のサンプルの場合は、以下のようになっています。
ArithmeticClass.ArithmeticMethodDelegate ArithmeticDelegate = new ArithmeticClass.ArithmeticMethodDelegate(ArithmeticClass.AddMethod);
次に、オブジェクトに収めたメソッドを、実際に実行するには、オブジェクト名をメソッド名のように扱って、普通にメソッドを実行するだけです。
戻り値の型 戻り値格納用オブジェクト = デリゲート用オブジェクト名(引数の型 引数1, 引数の型 引数2, ---);
前述のサンプルの場合は、以下のようになっています。
float ans = ArithmeticDelegate(data1, data2);
アドバイス(このノートのライターへのメッセージ)を送る
このノートはどうでしたか? いいと思ったことや、こうしたらもっとよくなるといったメッセージを送りましょう! ノートの内容やライターについて質問がある場合は、Q&Aから質問してみましょう
アドバイスを送るには、
Yahoo! JAPAN IDでのログインおよび
Yahoo!知恵袋の利用登録が必要です。
感想アドバイス履歴
-
現在アドバイスはありません
このノートに関するQ&A
このノートに関するQ&Aは、まだありません。